EECS 498-007/598-005 Assignment 5-1: Single-Stage Object Detector - YOLO¶

Single-Stage Object Detector¶

In this exercise you will implement a single-stage object detector, based on YOLO (v1 and v2) and use it to train a model that can detect objects on novel images. We will also evaluate the detection accuracy using the classic metric mean Average Precision (mAP). The main difference between single-stage and two-stage detectors is that single-stage detectors perform region proposal and classification simultaneously while two-stage detectors have them decoupled.

Getting Started¶

Install starter code¶

We will use the utility functions in the following package: coutils package. Run this cell to download and install it.

InĀ [4]:
# Solve bug from mAP repo
!pip install matplotlib==3.5.3
Requirement already satisfied: matplotlib==3.5.3 in /usr/local/lib/python3.10/dist-packages (3.5.3)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (4.49.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (1.4.5)
Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (1.25.2)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (24.0)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (9.4.0)
Requirement already satisfied: pyparsing>=2.2.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (3.1.2)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib==3.5.3) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib==3.5.3) (1.16.0)
InĀ [5]:
!pip install git+https://github.com/deepvision-class/starter-code
Collecting git+https://github.com/deepvision-class/starter-code
  Cloning https://github.com/deepvision-class/starter-code to /tmp/pip-req-build-neg_kcvo
  Running command git clone --filter=blob:none --quiet https://github.com/deepvision-class/starter-code /tmp/pip-req-build-neg_kcvo
  Resolved https://github.com/deepvision-class/starter-code to commit e8d9fe711870a39796a2f8ad95538e57942d756f
  Preparing metadata (setup.py) ... done
Requirement already satisfied: pydrive in /usr/local/lib/python3.10/dist-packages (from Colab-Utils==0.1.dev0) (1.3.1)
Requirement already satisfied: google-api-python-client>=1.2 in /usr/local/lib/python3.10/dist-packages (from pydrive->Colab-Utils==0.1.dev0) (2.84.0)
Requirement already satisfied: oauth2client>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from pydrive->Colab-Utils==0.1.dev0) (4.1.3)
Requirement already satisfied: PyYAML>=3.0 in /usr/local/lib/python3.10/dist-packages (from pydrive->Colab-Utils==0.1.dev0) (6.0.1)
Requirement already satisfied: httplib2<1dev,>=0.15.0 in /usr/local/lib/python3.10/dist-packages (from google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (0.22.0)
Requirement already satisfied: google-auth<3.0.0dev,>=1.19.0 in /usr/local/lib/python3.10/dist-packages (from google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (2.27.0)
Requirement already satisfied: google-auth-httplib2>=0.1.0 in /usr/local/lib/python3.10/dist-packages (from google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (0.1.1)
Requirement already satisfied: google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5 in /usr/local/lib/python3.10/dist-packages (from google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (2.11.1)
Requirement already satisfied: uritemplate<5,>=3.0.1 in /usr/local/lib/python3.10/dist-packages (from google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (4.1.1)
Requirement already satisfied: pyasn1>=0.1.7 in /usr/local/lib/python3.10/dist-packages (from oauth2client>=4.0.0->pydrive->Colab-Utils==0.1.dev0) (0.5.1)
Requirement already satisfied: pyasn1-modules>=0.0.5 in /usr/local/lib/python3.10/dist-packages (from oauth2client>=4.0.0->pydrive->Colab-Utils==0.1.dev0) (0.3.0)
Requirement already satisfied: rsa>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from oauth2client>=4.0.0->pydrive->Colab-Utils==0.1.dev0) (4.9)
Requirement already satisfied: six>=1.6.1 in /usr/local/lib/python3.10/dist-packages (from oauth2client>=4.0.0->pydrive->Colab-Utils==0.1.dev0) (1.16.0)
Requirement already satisfied: googleapis-common-protos<2.0.dev0,>=1.56.2 in /usr/local/lib/python3.10/dist-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (1.63.0)
Requirement already satisfied: protobuf!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0.dev0,>=3.19.5 in /usr/local/lib/python3.10/dist-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (3.20.3)
Requirement already satisfied: requests<3.0.0.dev0,>=2.18.0 in /usr/local/lib/python3.10/dist-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (2.31.0)
Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3.0.0dev,>=1.19.0->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (5.3.3)
Requirement already satisfied: pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2 in /usr/local/lib/python3.10/dist-packages (from httplib2<1dev,>=0.15.0->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (3.1.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (3.6)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-api-python-client>=1.2->pydrive->Colab-Utils==0.1.dev0) (2024.2.2)

Setup code¶

Run some setup code for this notebook: Import some useful packages and increase the default figure size.

InĀ [6]:
import math
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import coutils
from coutils import extract_drive_file_id, register_colab_notebooks, \
                    fix_random_seed, rel_error
import matplotlib.pyplot as plt
import numpy as np
import cv2
import copy
import time
import shutil
import os

# for plotting
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

# data type and device for torch.tensor
to_float = {'dtype': torch.float, 'device': 'cpu'}
to_float_cuda = {'dtype': torch.float, 'device': 'cuda'}
to_double = {'dtype': torch.double, 'device': 'cpu'}
to_double_cuda = {'dtype': torch.double, 'device': 'cuda'}
to_long = {'dtype': torch.long, 'device': 'cpu'}
to_long_cuda = {'dtype': torch.long, 'device': 'cuda'}

# for mAP evaluation
!rm -rf mAP
!git clone https://github.com/Cartucho/mAP.git
!rm -rf mAP/input/*
WARNING:root:pydrive is deprecated and no longer maintained. We recommend that you migrate your projects to pydrive2, the maintained fork of pydrive
Cloning into 'mAP'...
remote: Enumerating objects: 908, done.
remote: Counting objects: 100% (150/150), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 908 (delta 135), reused 125 (delta 125), pack-reused 758
Receiving objects: 100% (908/908), 14.70 MiB | 16.03 MiB/s, done.
Resolving deltas: 100% (329/329), done.

We will use GPUs to accelerate our computation in this notebook. Run the following to make sure GPUs are enabled:

InĀ [7]:
if torch.cuda.is_available:
  print('Good to go!')
else:
  print('Please set GPU via Edit -> Notebook Settings.')
Good to go!

Load PASCAL VOC 2007 data¶

In order to train and evaluate object detection models, we need a dataset where each image is annotated with a set of bounding boxes, where each box gives the category label and spatial extent of some object in the image.

We will use the PASCAL VOC 2007 dataset, which provides annotations of this form. PASCAL VOC ran a series of yearly computer vision competitions from 2005 to 2012, predating the ImageNet challenge which we have discussed in class.

The data from the 2007 challenge used to be one of the most popular datasets for evaluating object detection. It is much smaller than more recent object detection datasets such as COCO, and thus easier to manage in an homework assignment.

The following function will download the PASCAL VOC 2007 dataset and return it as a PyTorch Dataset object:

InĀ [8]:
def get_pascal_voc2007_data(image_root, split='train'):
  """
  Use torchvision.datasets
  https://pytorch.org/docs/stable/torchvision/datasets.html#torchvision.datasets.VOCDetection
  """
  from torchvision import datasets

  train_dataset = datasets.VOCDetection(image_root, year='2007', image_set=split,
                                    download=True)

  return train_dataset

Run the following cell to download the training and validation sets for the PASCAL VOC 2007 dataset:

The Dataset objects returned from the above function returns annotations for each image as a nested set of dictionary objects:

InĀ [9]:
# uncomment below to use the mirror link if the original link is broken
# !wget http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
train_dataset = get_pascal_voc2007_data('/content', 'train')
val_dataset = get_pascal_voc2007_data('/content', 'val')

# an example on the raw annotation
import json
print(json.dumps(train_dataset[1][1]['annotation'], indent=2))
Downloading http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar to /content/VOCtrainval_06-Nov-2007.tar
100%|ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆ| 460032000/460032000 [00:25<00:00, 18333771.33it/s]
Extracting /content/VOCtrainval_06-Nov-2007.tar to /content
Using downloaded and verified file: /content/VOCtrainval_06-Nov-2007.tar
Extracting /content/VOCtrainval_06-Nov-2007.tar to /content
{
  "folder": "VOC2007",
  "filename": "000017.jpg",
  "source": {
    "database": "The VOC2007 Database",
    "annotation": "PASCAL VOC2007",
    "image": "flickr",
    "flickrid": "228217974"
  },
  "owner": {
    "flickrid": "genewolf",
    "name": "whiskey kitten"
  },
  "size": {
    "width": "480",
    "height": "364",
    "depth": "3"
  },
  "segmented": "0",
  "object": [
    {
      "name": "person",
      "pose": "Left",
      "truncated": "0",
      "difficult": "0",
      "bndbox": {
        "xmin": "185",
        "ymin": "62",
        "xmax": "279",
        "ymax": "199"
      }
    },
    {
      "name": "horse",
      "pose": "Left",
      "truncated": "0",
      "difficult": "0",
      "bndbox": {
        "xmin": "90",
        "ymin": "78",
        "xmax": "403",
        "ymax": "336"
      }
    }
  ]
}

In order to use these annotations to train our model, we need to convert this nested dictionary data structure into a set of PyTorch tensors.

We also need to preprocess the image, converting it to a PyTorch tensor and resizing it to 224x224. Real object detection systems typically work with much higher-resolution images, but we will use a low resolution for computational efficiency in this assignment.

We also want to train our models using minibatches of data, so we need to group the annotations from several images into minibatches.

We perform both of these functions by using a customized PyTorch DataLoader object, which we have written for you:

InĀ [10]:
def pascal_voc2007_loader(dataset, batch_size, num_workers=0):
  """
  Data loader for Pascal VOC 2007.
  https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader
  """
  from torch.utils.data import DataLoader
  # turn off shuffle so we can index the original image
  train_loader = DataLoader(dataset,
                            batch_size=batch_size,
                            shuffle=False, pin_memory=True,
                            num_workers=num_workers,
                            collate_fn=voc_collate_fn)
  return train_loader


class_to_idx = {'aeroplane':0, 'bicycle':1, 'bird':2, 'boat':3, 'bottle':4,
                'bus':5, 'car':6, 'cat':7, 'chair':8, 'cow':9, 'diningtable':10,
                'dog':11, 'horse':12, 'motorbike':13, 'person':14, 'pottedplant':15,
                'sheep':16, 'sofa':17, 'train':18, 'tvmonitor':19
}
idx_to_class = {i:c for c, i in class_to_idx.items()}


from torchvision import transforms

def voc_collate_fn(batch_lst, reshape_size=224):
    preprocess = transforms.Compose([
      transforms.Resize((reshape_size, reshape_size)),
      transforms.ToTensor(),
      transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      ])

    batch_size = len(batch_lst)

    img_batch = torch.zeros(batch_size, 3, reshape_size, reshape_size)

    max_num_box = max(len(batch_lst[i][1]['annotation']['object']) \
                      for i in range(batch_size))

    box_batch = torch.Tensor(batch_size, max_num_box, 5).fill_(-1.)
    w_list = []
    h_list = []
    img_id_list = []

    for i in range(batch_size):
      img, ann = batch_lst[i]
      w_list.append(img.size[0]) # image width
      h_list.append(img.size[1]) # image height
      img_id_list.append(ann['annotation']['filename'])
      img_batch[i] = preprocess(img)
      all_bbox = ann['annotation']['object']
      if type(all_bbox) == dict: # inconsistency in the annotation file
        all_bbox = [all_bbox]
      for bbox_idx, one_bbox in enumerate(all_bbox):
        bbox = one_bbox['bndbox']
        obj_cls = one_bbox['name']
        box_batch[i][bbox_idx] = torch.Tensor([float(bbox['xmin']), float(bbox['ymin']),
          float(bbox['xmax']), float(bbox['ymax']), class_to_idx[obj_cls]])

    h_batch = torch.tensor(h_list)
    w_batch = torch.tensor(w_list)

    return img_batch, box_batch, w_batch, h_batch, img_id_list

Training with the entire PASCAL VOC will be too computationally expensive for this homework assignment, so we can subsample the dataset by wrapping each Dataset object in a Subset object:

InĀ [11]:
train_dataset = torch.utils.data.Subset(train_dataset, torch.arange(0, 2500)) # use 2500 samples for training
train_loader = pascal_voc2007_loader(train_dataset, 10)
val_loader = pascal_voc2007_loader(val_dataset, 10)

The DataLoader objects return batches of data.

The first output from the DataLoader is a Tensor img of shape (B, 3, 224, 224). This is a batch of B images, similar to what we have seen in classification datasets.

The second output from the DataLoader is a Tensor ann of shape (B, N, 5) giving information about all objects in all images of the batch. ann[i, j] = (x_tl, y_tl, x_br, y_br, class) gives information about the jth object in img[i]. The position of the top-left corner of the box is (x_tl, y_tl) and the position of the bottom-right corner of the box is (x_br, y_br). These positions are in the coordinate system of the original image (before it was resized to 224 x 224). class is an integer giving the category label for this bounding box.

Each image can have different numbers of objects. If img[i] has $N_i$ objects, then $N=\max_i N_i$ is the maximum number of objects per image among all objects in the batch; this value can vary from batch to batch. For the images that have fewer than $N$ annotated objects, only the first $N_i$ rows of $anns[i]$ contain annotations; the remaining rows are padded with -1.

InĀ [12]:
train_loader_iter = iter(train_loader)
img, ann, _, _, _ = next(train_loader_iter)

print('img has shape: ', img.shape)
print('ann has shape: ', ann.shape)

print('Image 1 has only two annotated objects, so ann[1] is padded with -1:')
print(ann[1])

print('\nImage 2 has six annotated objects:, so ann[2] is not padded:')
print(ann[2])

print('\nEach row in the annotation tensor indicates (x_tl, y_tl, x_br, y_br, class).')
img has shape:  torch.Size([10, 3, 224, 224])
ann has shape:  torch.Size([10, 6, 5])
Image 1 has only two annotated objects, so ann[1] is padded with -1:
tensor([[185.,  62., 279., 199.,  14.],
        [ 90.,  78., 403., 336.,  12.],
        [ -1.,  -1.,  -1.,  -1.,  -1.],
        [ -1.,  -1.,  -1.,  -1.,  -1.],
        [ -1.,  -1.,  -1.,  -1.,  -1.],
        [ -1.,  -1.,  -1.,  -1.,  -1.]])

Image 2 has six annotated objects:, so ann[2] is not padded:
tensor([[  9., 230., 245., 500.,   1.],
        [230., 220., 334., 500.,   1.],
        [  2., 178.,  90., 500.,   1.],
        [  2.,   1., 117., 369.,  14.],
        [  3.,   2., 243., 462.,  14.],
        [225.,   1., 334., 486.,  14.]])

Each row in the annotation tensor indicates (x_tl, y_tl, x_br, y_br, class).

Coordinate transformation¶

It's a good practice to use a consistent coordinate system for all the spatial-related computations (e.g., anchors, proposals). In this assignment, we use the coordinate system defined by the CNN activation map (of shape 7x7), where the top-left corner is (0, 0) and the bottom-right corner is (7, 7). The horizontal axis is the x axis and the vertical axis is the y axis.

The following function defines the transformation from the original image coordinate system (pixels, and the top-left corner is (0, 0)) to the activation map coordinate system and vice versa.

Notes: All the coordinates are in float precision. In later sections, we use the activation map coordinate system for all computations except for visualization.

InĀ [13]:
def coord_trans(bbox, w_pixel, h_pixel, w_amap=7, h_amap=7, mode='a2p'):
  """
  Coordinate transformation function. It converts the box coordinate from
  the image coordinate system to the activation map coordinate system and vice versa.
  In our case, the input image will have a few hundred of pixels in
  width/height while the activation map is of size 7x7.

  Input:
  - bbox: Could be either bbox, anchor, or proposal, of shape Bx*x4
  - w_pixel: Number of pixels in the width side of the original image, of shape B
  - h_pixel: Number of pixels in the height side of the original image, of shape B
  - w_amap: Number of pixels in the width side of the activation map, scalar
  - h_amap: Number of pixels in the height side of the activation map, scalar
  - mode: Whether transfer from the original image to activation map ('p2a') or
          the opposite ('a2p')

  Output:
  - resized_bbox: Resized box coordinates, of the same shape as the input bbox
  """

  assert mode in ('p2a', 'a2p'), 'invalid coordinate transformation mode!'
  assert bbox.shape[-1] >= 4, 'the transformation is applied to the first 4 values of dim -1'

  if bbox.shape[0] == 0: # corner cases
    return bbox

  resized_bbox = bbox.clone()
  # could still work if the first dim of bbox is not batch size
  # in that case, w_pixel and h_pixel will be scalars
  resized_bbox = resized_bbox.view(bbox.shape[0], -1, bbox.shape[-1])
  invalid_bbox_mask = (resized_bbox == -1) # indicating invalid bbox

  if mode == 'p2a':
    # pixel to activation
    width_ratio = w_pixel * 1. / w_amap
    height_ratio = h_pixel * 1. / h_amap
    resized_bbox[:, :, [0, 2]] /= width_ratio.view(-1, 1, 1)
    resized_bbox[:, :, [1, 3]] /= height_ratio.view(-1, 1, 1)
  else:
    # activation to pixel
    width_ratio = w_pixel * 1. / w_amap
    height_ratio = h_pixel * 1. / h_amap
    resized_bbox[:, :, [0, 2]] *= width_ratio.view(-1, 1, 1)
    resized_bbox[:, :, [1, 3]] *= height_ratio.view(-1, 1, 1)

  resized_bbox.masked_fill_(invalid_bbox_mask, -1)
  resized_bbox.resize_as_(bbox)
  return resized_bbox

Data Visualizer¶

This function will help us visualize boxes on top of images.

InĀ [14]:
def data_visualizer(img, idx_to_class, bbox=None, pred=None):
  """
  Data visualizer on the original image. Support both GT box input and proposal input.

  Input:
  - img: PIL Image input
  - idx_to_class: Mapping from the index (0-19) to the class name
  - bbox: GT bbox (in red, optional), a tensor of shape Nx5, where N is
          the number of GT boxes, 5 indicates (x_tl, y_tl, x_br, y_br, class)
  - pred: Predicted bbox (in green, optional), a tensor of shape N'x6, where
          N' is the number of predicted boxes, 6 indicates
          (x_tl, y_tl, x_br, y_br, class, object confidence score)
  """

  img_copy = np.array(img).astype('uint8')

  if bbox is not None:
    for bbox_idx in range(bbox.shape[0]):
      one_bbox = bbox[bbox_idx][:4]
      top_left = (int(one_bbox[0]), int(one_bbox[1]))
      bottom_right = (int(one_bbox[2]), int(one_bbox[3]))
      cv2.rectangle(img_copy, top_left, bottom_right, (255, 0, 0), 2)
      if bbox.shape[1] > 4: # if class info provided
        obj_cls = idx_to_class[bbox[bbox_idx][4].item()]
        cv2.putText(img_copy, '%s' % (obj_cls),
                  (int(one_bbox[0]), int(one_bbox[1]+15)),
                  cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 255), thickness=1)

  if pred is not None:
    for bbox_idx in range(pred.shape[0]):
      one_bbox = pred[bbox_idx][:4]
      top_left = (int(one_bbox[0]), int(one_bbox[1]))
      bottom_right = (int(one_bbox[2]), int(one_bbox[3]))
      cv2.rectangle(img_copy, top_left, bottom_right, (0, 255, 0), 2)

      if pred.shape[1] > 4: # if class and conf score info provided
        obj_cls = idx_to_class[pred[bbox_idx][4].item()]
        conf_score = pred[bbox_idx][5].item()
        location = (int(one_bbox[0]), int(one_bbox[1]+15))
        cv2.putText(img_copy, '%s, %.2f' % (obj_cls, conf_score), location,
                    cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 255), thickness=1)

  plt.imshow(img_copy)
  plt.axis('off')
  plt.show()

Visualize PASCAL VOC 2007¶

It is always good practice to try and visualize parts of your dataset before you build a model.

Here we sample some images from the PASCAL VOC 2007 training set, and visualize the ground-truth object boxes and category labels:

InĀ [15]:
# default examples for visualization
fix_random_seed(0)
batch_size = 3
sampled_idx = torch.linspace(0, len(train_dataset)-1, steps=batch_size).long()

# get the size of each image first
h_list = []
w_list = []
img_list = [] # list of images
MAX_NUM_BBOX = 40
box_list = torch.LongTensor(batch_size, MAX_NUM_BBOX, 5).fill_(-1) # PADDED GT boxes

for idx, i in enumerate(sampled_idx):
  # hack to get the original image so we don't have to load from local again...
  img, ann = train_dataset.__getitem__(i)
  img_list.append(img)

  all_bbox = ann['annotation']['object']
  if type(all_bbox) == dict:
    all_bbox = [all_bbox]
  for bbox_idx, one_bbox in enumerate(all_bbox):
    bbox = one_bbox['bndbox']
    obj_cls = one_bbox['name']
    box_list[idx][bbox_idx] = torch.LongTensor([int(bbox['xmin']), int(bbox['ymin']),
      int(bbox['xmax']), int(bbox['ymax']), class_to_idx[obj_cls]])

  # get sizes
  img = np.array(img)
  w_list.append(img.shape[1])
  h_list.append(img.shape[0])

w_list = torch.as_tensor(w_list, **to_float_cuda)
h_list = torch.as_tensor(h_list, **to_float_cuda)
box_list = torch.as_tensor(box_list, **to_float_cuda)
resized_box_list = coord_trans(box_list, w_list, h_list, mode='p2a') # on activation map coordinate system
InĀ [16]:
# visualize GT boxes
for i in range(len(img_list)):
  valid_box = sum([1 if j != -1 else 0 for j in box_list[i][:, 0]])
  data_visualizer(img_list[i], idx_to_class, box_list[i][:valid_box])
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Detector Backbone Network¶

Here, we use MobileNet v2 for image feature extraction.

InĀ [17]:
class FeatureExtractor(nn.Module):
  """
  Image feature extraction with MobileNet.
  """
  def __init__(self, reshape_size=224, pooling=False, verbose=False):
    super().__init__()

    from torchvision import models
    from torchsummary import summary

    self.mobilenet = models.mobilenet_v2(pretrained=True)
    self.mobilenet = nn.Sequential(*list(self.mobilenet.children())[:-1]) # Remove the last classifier

    # average pooling
    if pooling:
      self.mobilenet.add_module('LastAvgPool', nn.AvgPool2d(math.ceil(reshape_size/32.))) # input: N x 1280 x 7 x 7

    for i in self.mobilenet.named_parameters():
      i[1].requires_grad = True # fine-tune all

    if verbose:
      summary(self.mobilenet.cuda(), (3, reshape_size, reshape_size))

  def forward(self, img, verbose=False):
    """
    Inputs:
    - img: Batch of resized images, of shape Nx3x224x224

    Outputs:
    - feat: Image feature, of shape Nx1280 (pooled) or Nx1280x7x7
    """
    num_img = img.shape[0]

    img_prepro = img

    feat = []
    process_batch = 500
    for b in range(math.ceil(num_img/process_batch)):
      feat.append(self.mobilenet(img_prepro[b*process_batch:(b+1)*process_batch]
                              ).squeeze(-1).squeeze(-1)) # forward and squeeze
    feat = torch.cat(feat)

    if verbose:
      print('Output feature shape: ', feat.shape)

    return feat

Now, let's see what's inside MobileNet v2. Assume we have a 3x224x224 image input.

InĀ [18]:
model = FeatureExtractor(verbose=True)
/usr/local/lib/python3.10/dist-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.
  warnings.warn(
/usr/local/lib/python3.10/dist-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=MobileNet_V2_Weights.IMAGENET1K_V1`. You can also use `weights=MobileNet_V2_Weights.DEFAULT` to get the most up-to-date weights.
  warnings.warn(msg)
Downloading: "https://download.pytorch.org/models/mobilenet_v2-b0353104.pth" to /root/.cache/torch/hub/checkpoints/mobilenet_v2-b0353104.pth
100%|ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆ| 13.6M/13.6M [00:00<00:00, 34.2MB/s]
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 32, 112, 112]             864
       BatchNorm2d-2         [-1, 32, 112, 112]              64
             ReLU6-3         [-1, 32, 112, 112]               0
            Conv2d-4         [-1, 32, 112, 112]             288
       BatchNorm2d-5         [-1, 32, 112, 112]              64
             ReLU6-6         [-1, 32, 112, 112]               0
            Conv2d-7         [-1, 16, 112, 112]             512
       BatchNorm2d-8         [-1, 16, 112, 112]              32
  InvertedResidual-9         [-1, 16, 112, 112]               0
           Conv2d-10         [-1, 96, 112, 112]           1,536
      BatchNorm2d-11         [-1, 96, 112, 112]             192
            ReLU6-12         [-1, 96, 112, 112]               0
           Conv2d-13           [-1, 96, 56, 56]             864
      BatchNorm2d-14           [-1, 96, 56, 56]             192
            ReLU6-15           [-1, 96, 56, 56]               0
           Conv2d-16           [-1, 24, 56, 56]           2,304
      BatchNorm2d-17           [-1, 24, 56, 56]              48
 InvertedResidual-18           [-1, 24, 56, 56]               0
           Conv2d-19          [-1, 144, 56, 56]           3,456
      BatchNorm2d-20          [-1, 144, 56, 56]             288
            ReLU6-21          [-1, 144, 56, 56]               0
           Conv2d-22          [-1, 144, 56, 56]           1,296
      BatchNorm2d-23          [-1, 144, 56, 56]             288
            ReLU6-24          [-1, 144, 56, 56]               0
           Conv2d-25           [-1, 24, 56, 56]           3,456
      BatchNorm2d-26           [-1, 24, 56, 56]              48
 InvertedResidual-27           [-1, 24, 56, 56]               0
           Conv2d-28          [-1, 144, 56, 56]           3,456
      BatchNorm2d-29          [-1, 144, 56, 56]             288
            ReLU6-30          [-1, 144, 56, 56]               0
           Conv2d-31          [-1, 144, 28, 28]           1,296
      BatchNorm2d-32          [-1, 144, 28, 28]             288
            ReLU6-33          [-1, 144, 28, 28]               0
           Conv2d-34           [-1, 32, 28, 28]           4,608
      BatchNorm2d-35           [-1, 32, 28, 28]              64
 InvertedResidual-36           [-1, 32, 28, 28]               0
           Conv2d-37          [-1, 192, 28, 28]           6,144
      BatchNorm2d-38          [-1, 192, 28, 28]             384
            ReLU6-39          [-1, 192, 28, 28]               0
           Conv2d-40          [-1, 192, 28, 28]           1,728
      BatchNorm2d-41          [-1, 192, 28, 28]             384
            ReLU6-42          [-1, 192, 28, 28]               0
           Conv2d-43           [-1, 32, 28, 28]           6,144
      BatchNorm2d-44           [-1, 32, 28, 28]              64
 InvertedResidual-45           [-1, 32, 28, 28]               0
           Conv2d-46          [-1, 192, 28, 28]           6,144
      BatchNorm2d-47          [-1, 192, 28, 28]             384
            ReLU6-48          [-1, 192, 28, 28]               0
           Conv2d-49          [-1, 192, 28, 28]           1,728
      BatchNorm2d-50          [-1, 192, 28, 28]             384
            ReLU6-51          [-1, 192, 28, 28]               0
           Conv2d-52           [-1, 32, 28, 28]           6,144
      BatchNorm2d-53           [-1, 32, 28, 28]              64
 InvertedResidual-54           [-1, 32, 28, 28]               0
           Conv2d-55          [-1, 192, 28, 28]           6,144
      BatchNorm2d-56          [-1, 192, 28, 28]             384
            ReLU6-57          [-1, 192, 28, 28]               0
           Conv2d-58          [-1, 192, 14, 14]           1,728
      BatchNorm2d-59          [-1, 192, 14, 14]             384
            ReLU6-60          [-1, 192, 14, 14]               0
           Conv2d-61           [-1, 64, 14, 14]          12,288
      BatchNorm2d-62           [-1, 64, 14, 14]             128
 InvertedResidual-63           [-1, 64, 14, 14]               0
           Conv2d-64          [-1, 384, 14, 14]          24,576
      BatchNorm2d-65          [-1, 384, 14, 14]             768
            ReLU6-66          [-1, 384, 14, 14]               0
           Conv2d-67          [-1, 384, 14, 14]           3,456
      BatchNorm2d-68          [-1, 384, 14, 14]             768
            ReLU6-69          [-1, 384, 14, 14]               0
           Conv2d-70           [-1, 64, 14, 14]          24,576
      BatchNorm2d-71           [-1, 64, 14, 14]             128
 InvertedResidual-72           [-1, 64, 14, 14]               0
           Conv2d-73          [-1, 384, 14, 14]          24,576
      BatchNorm2d-74          [-1, 384, 14, 14]             768
            ReLU6-75          [-1, 384, 14, 14]               0
           Conv2d-76          [-1, 384, 14, 14]           3,456
      BatchNorm2d-77          [-1, 384, 14, 14]             768
            ReLU6-78          [-1, 384, 14, 14]               0
           Conv2d-79           [-1, 64, 14, 14]          24,576
      BatchNorm2d-80           [-1, 64, 14, 14]             128
 InvertedResidual-81           [-1, 64, 14, 14]               0
           Conv2d-82          [-1, 384, 14, 14]          24,576
      BatchNorm2d-83          [-1, 384, 14, 14]             768
            ReLU6-84          [-1, 384, 14, 14]               0
           Conv2d-85          [-1, 384, 14, 14]           3,456
      BatchNorm2d-86          [-1, 384, 14, 14]             768
            ReLU6-87          [-1, 384, 14, 14]               0
           Conv2d-88           [-1, 64, 14, 14]          24,576
      BatchNorm2d-89           [-1, 64, 14, 14]             128
 InvertedResidual-90           [-1, 64, 14, 14]               0
           Conv2d-91          [-1, 384, 14, 14]          24,576
      BatchNorm2d-92          [-1, 384, 14, 14]             768
            ReLU6-93          [-1, 384, 14, 14]               0
           Conv2d-94          [-1, 384, 14, 14]           3,456
      BatchNorm2d-95          [-1, 384, 14, 14]             768
            ReLU6-96          [-1, 384, 14, 14]               0
           Conv2d-97           [-1, 96, 14, 14]          36,864
      BatchNorm2d-98           [-1, 96, 14, 14]             192
 InvertedResidual-99           [-1, 96, 14, 14]               0
          Conv2d-100          [-1, 576, 14, 14]          55,296
     BatchNorm2d-101          [-1, 576, 14, 14]           1,152
           ReLU6-102          [-1, 576, 14, 14]               0
          Conv2d-103          [-1, 576, 14, 14]           5,184
     BatchNorm2d-104          [-1, 576, 14, 14]           1,152
           ReLU6-105          [-1, 576, 14, 14]               0
          Conv2d-106           [-1, 96, 14, 14]          55,296
     BatchNorm2d-107           [-1, 96, 14, 14]             192
InvertedResidual-108           [-1, 96, 14, 14]               0
          Conv2d-109          [-1, 576, 14, 14]          55,296
     BatchNorm2d-110          [-1, 576, 14, 14]           1,152
           ReLU6-111          [-1, 576, 14, 14]               0
          Conv2d-112          [-1, 576, 14, 14]           5,184
     BatchNorm2d-113          [-1, 576, 14, 14]           1,152
           ReLU6-114          [-1, 576, 14, 14]               0
          Conv2d-115           [-1, 96, 14, 14]          55,296
     BatchNorm2d-116           [-1, 96, 14, 14]             192
InvertedResidual-117           [-1, 96, 14, 14]               0
          Conv2d-118          [-1, 576, 14, 14]          55,296
     BatchNorm2d-119          [-1, 576, 14, 14]           1,152
           ReLU6-120          [-1, 576, 14, 14]               0
          Conv2d-121            [-1, 576, 7, 7]           5,184
     BatchNorm2d-122            [-1, 576, 7, 7]           1,152
           ReLU6-123            [-1, 576, 7, 7]               0
          Conv2d-124            [-1, 160, 7, 7]          92,160
     BatchNorm2d-125            [-1, 160, 7, 7]             320
InvertedResidual-126            [-1, 160, 7, 7]               0
          Conv2d-127            [-1, 960, 7, 7]         153,600
     BatchNorm2d-128            [-1, 960, 7, 7]           1,920
           ReLU6-129            [-1, 960, 7, 7]               0
          Conv2d-130            [-1, 960, 7, 7]           8,640
     BatchNorm2d-131            [-1, 960, 7, 7]           1,920
           ReLU6-132            [-1, 960, 7, 7]               0
          Conv2d-133            [-1, 160, 7, 7]         153,600
     BatchNorm2d-134            [-1, 160, 7, 7]             320
InvertedResidual-135            [-1, 160, 7, 7]               0
          Conv2d-136            [-1, 960, 7, 7]         153,600
     BatchNorm2d-137            [-1, 960, 7, 7]           1,920
           ReLU6-138            [-1, 960, 7, 7]               0
          Conv2d-139            [-1, 960, 7, 7]           8,640
     BatchNorm2d-140            [-1, 960, 7, 7]           1,920
           ReLU6-141            [-1, 960, 7, 7]               0
          Conv2d-142            [-1, 160, 7, 7]         153,600
     BatchNorm2d-143            [-1, 160, 7, 7]             320
InvertedResidual-144            [-1, 160, 7, 7]               0
          Conv2d-145            [-1, 960, 7, 7]         153,600
     BatchNorm2d-146            [-1, 960, 7, 7]           1,920
           ReLU6-147            [-1, 960, 7, 7]               0
          Conv2d-148            [-1, 960, 7, 7]           8,640
     BatchNorm2d-149            [-1, 960, 7, 7]           1,920
           ReLU6-150            [-1, 960, 7, 7]               0
          Conv2d-151            [-1, 320, 7, 7]         307,200
     BatchNorm2d-152            [-1, 320, 7, 7]             640
InvertedResidual-153            [-1, 320, 7, 7]               0
          Conv2d-154           [-1, 1280, 7, 7]         409,600
     BatchNorm2d-155           [-1, 1280, 7, 7]           2,560
           ReLU6-156           [-1, 1280, 7, 7]               0
================================================================
Total params: 2,223,872
Trainable params: 2,223,872
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 152.85
Params size (MB): 8.48
Estimated Total Size (MB): 161.91
----------------------------------------------------------------

Anchor and Proposal¶

The concept of anchor is introduced in Faster R-CNN and later used in numerous later works including YOLO v2. The definition of anchor from the original paper is summarized as follows:

After passing the input image through the backbone network, we have a convolutional feature map of shape $(C, 7, 7)$ which we interpret as a 7x7 grid of $C$-dimensional features. At each point in this grid, we consider a set of $A$ anchor boxes of different sizes and shapes; for each anchor box we classify it as either an object or background box. The total number of anchor boxes that we consider for the entire input image is $(A, 7, 7)$; we predict classification scores of this shape by applying a sequence of convolutional layers to the backbone features.

We slide a small network (e.g., 3x3 conv layer) over the CNN activation feature map. We call this 3x3 conv a sliding window. At each sliding-window location (i.e., centered at each position of the 7x7 activation cell), we simultaneously predict multiple region proposals, where the number of proposals for each location is denoted as $A=9$.

Later, we will have an object proposal layer outputs A-D scores that estimate probability of object for each proposal, a bounding box regression layer to produce 4A-D outputs encoding the coordinates of A boxes, and a region classification layer to produce 20-D outputs indicating the probability of being each object category (shared by all A anchors). The A proposals are parameterized relative to A reference boxes, which we call anchors. An anchor is centered at the sliding window in question, and is associated with a shape (e.g., 1x1, 3x3, 5x5). The list of anchor shapes are provided next.

Anchor shapes¶

At each spatial position of the 7x7 backbone features, we consider a set of $A$ anchor boxes. Different spatial positions all use anchors of the same shape.

The shapes of the anchor boxes are a hyperparameter. We will provide the anchor shapes for you. In some papers (e.g. YOLO v2), the anchor shapes are determined in a data-driven way by clustering the set of ground-truth box sizes, but for simplicity we will not use that approach in this assignment.

Note that anchors could be much larger than the 3x3 sliding window (e.g., 5x5) since the receptive field of activation cell on the original image could be large.

InĀ [19]:
# Declare variables for anchor priors, a Ax2 Tensor where A is the number of anchors.
# Hand-picked, same as our two-stage detector.
anchor_list = torch.tensor([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [2, 3], [3, 2], [3, 5], [5, 3]], **to_float_cuda)
print(anchor_list.shape)
torch.Size([9, 2])

Activation Grid Generator¶

In order to place anchors centered at each position of the 7x7 grid of backbone features, we need to know the spatial position of the center of each cell in the 7x7 grid of features.

This function will compute these center coordinates for us.

InĀ [20]:
def GenerateGrid(batch_size, w_amap=7, h_amap=7, dtype=torch.float32, device='cuda'):
  """
  Return a grid cell given a batch size (center coordinates).

  Inputs:
  - batch_size, B
  - w_amap: or W', width of the activation map (number of grids in the horizontal dimension)
  - h_amap: or H', height of the activation map (number of grids in the vertical dimension)
  - W' and H' are always 7 in our case while w and h might vary.

  Outputs:
  grid: A float32 tensor of shape (B, H', W', 2) giving the (x, y) coordinates
        of the centers of each feature for a feature map of shape (B, D, H', W')
  """
  w_range = torch.arange(0, w_amap, dtype=dtype, device=device) + 0.5
  h_range = torch.arange(0, h_amap, dtype=dtype, device=device) + 0.5

  w_grid_idx = w_range.unsqueeze(0).repeat(h_amap, 1)
  h_grid_idx = h_range.unsqueeze(1).repeat(1, w_amap)
  grid = torch.stack([w_grid_idx, h_grid_idx], dim=-1)
  grid = grid.unsqueeze(0).repeat(batch_size, 1, 1, 1)

  return grid
InĀ [21]:
# visualization
# simply create an activation grid where the cells are in green and the centers in red
# you should see the entire image divided by a 7x7 grid, with no gaps on the edges

grid_list = GenerateGrid(w_list.shape[0], device='cuda')

center = torch.cat((grid_list, grid_list), dim=-1)
grid_cell = center.clone()
grid_cell[:, :, :, [0, 1]] -= 1. / 2.
grid_cell[:, :, :, [2, 3]] += 1. / 2.
center = coord_trans(center, w_list, h_list)
grid_cell = coord_trans(grid_cell, w_list, h_list)

for img, anc, grid in zip(img_list, center, grid_cell):
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4), grid.reshape(-1, 4))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Anchor Generator¶

At this point we have defined the spatial sizes of anchors that we consider at each grid point, and we have computed the center of each grid point. We now combine these two pieces of information to compute the positions of all anchor boxes for the entire image.

We denote the anchor coordinates as ($x_{tl}^a$, $y_{tl}^a$, $x_{br}^a$, $y_{br}^a$), indicating the coordinates of the top-left corner and the bottom-right corner accordingly. The following function returns all the anchors given the anchor shapes and the grid cell. Note that the center of an anchor overlaps a grid cell center.

InĀ [22]:
def GenerateAnchor(anc, grid):
    """
     Anchor generator.

    Inputs:
    - anc: Tensor of shape (A, 2) giving the shapes of anchor boxes to consider at
      each point in the grid. anc[a] = (w, h) gives the width and height of the
      a'th anchor shape.
    - grid: Tensor of shape (B, H', W', 2) giving the (x, y) coordinates of the
      center of each feature from the backbone feature map. This is the tensor
      returned from GenerateGrid.

    Outputs:
    - anchors: Tensor of shape (B, A, H', W', 4) giving the positions of all
      anchor boxes for the entire image. anchors[b, a, h, w] is an anchor box
      centered at grid[b, h, w], whose shape is given by anc[a]; we parameterize
      boxes as anchors[b, a, h, w] = (x_tl, y_tl, x_br, y_br), where (x_tl, y_tl)
      and (x_br, y_br) give the xy coordinates of the top-left and bottom-right
      corners of the box.
    """
    anchors = None
    ##############################################################################
    # TODO: Given a set of anchor shapes and a grid cell on the activation map,  #
    # generate all the anchor coordinates for each image. Support batch input.   #
    ##############################################################################

    anchors = torch.Tensor(grid.shape[0], anc.shape[0], grid.shape[1], grid.shape[2], 4).fill_(-1.).cuda()

    anc_temp = anc[:, None, None, :]    # Want    (A, 1,  1,  2)
    grid_temp = grid[:, None, :, :, :]  # Want (B, 1, H', W', 2)

    anchors[..., 0] = grid_temp[..., 0] - anc_temp[..., 0] / 2
    anchors[..., 2] = grid_temp[..., 0] + anc_temp[..., 0] / 2
    anchors[..., 1] = grid_temp[..., 1] - anc_temp[..., 1] / 2
    anchors[..., 3] = grid_temp[..., 1] + anc_temp[..., 1] / 2

    ##############################################################################
    #                               END OF YOUR CODE                             #
    ##############################################################################

    return anchors

Run the following to check your implementation. You should see errors on the order of 1e-8 or less.

InĀ [23]:
# sanity check
anc_list = GenerateAnchor(anchor_list, grid_list)
assert anc_list.shape == torch.Size([3, 9, 7, 7, 4]), 'shape mismatch!'

expected_anc_list_mean = torch.tensor([[-1.25000000, -0.87500000,  2.25000000,  1.87500000],
                                       [ 1.75000000, -0.87500000,  5.25000000,  1.87500000],
                                       [ 4.75000000, -0.87500000,  8.25000000,  1.87500000],
                                       [-1.25000000,  1.12500000,  2.25000000,  3.87500000],
                                       [ 1.75000000,  1.12500000,  5.25000000,  3.87500000],
                                       [ 4.75000000,  1.12500000,  8.25000000,  3.87500000],
                                       [-1.25000000,  3.12500000,  2.25000000,  5.87500000],
                                       [ 1.75000000,  3.12500000,  5.25000000,  5.87500000],
                                       [ 4.75000000,  3.12500000,  8.25000000,  5.87500000],
                                       [-1.25000000,  5.12500000,  2.25000000,  7.87500000],
                                       [ 1.75000000,  5.12500000,  5.25000000,  7.87500000],
                                       [ 4.75000000,  5.12500000,  8.25000000,  7.87500000]], **to_float_cuda)
error = rel_error(expected_anc_list_mean, anc_list[0, [1,3,6,8], ::2, ::3, :].view(-1, 12, 4).mean(0))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Relative Error: {error}\n{color}Result: {result}\033[0m')
Relative Error: 0.0
Result: Pass
InĀ [24]:
# visualization
print('*'*80)
print('All nine anchors should be exactly centered:')
anc_list = GenerateAnchor(anchor_list, grid_list[:, 3:4, 3:4])
for img, anc in zip(img_list, coord_trans(anc_list, w_list, h_list)):
  print(anc.shape)
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4))

print('*'*80)
print('All anchors of the image (cluttered):')
anc_list = GenerateAnchor(anchor_list, grid_list) # all
for img, anc in zip(img_list, coord_trans(anc_list, w_list, h_list)):
  print(anc.shape)
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4))
********************************************************************************
All nine anchors should be exactly centered:
torch.Size([9, 1, 1, 4])
No description has been provided for this image
torch.Size([9, 1, 1, 4])
No description has been provided for this image
torch.Size([9, 1, 1, 4])
No description has been provided for this image
********************************************************************************
All anchors of the image (cluttered):
torch.Size([9, 7, 7, 4])
No description has been provided for this image
torch.Size([9, 7, 7, 4])
No description has been provided for this image
torch.Size([9, 7, 7, 4])
No description has been provided for this image

Proposal Generator¶

If we only use anchors to propose object locations, we can only cover 9x7x7=441 regions in the image. What if an object does not fall into any of the regions?

Hence, in the recent literatures (e.g., Fast R-CNN), the detector predicts transformations that convert anchor boxes into region proposals.

So far, we have represented anchors boxes by the coordinates of their top-left and bottom-right corners $(x_{tl}^a, y_{tl}^a, x_{br}^a, y_{br}^a)$. When converting anchors to proposals, it will be more convenient to parameterize boxes by the xy coordinate of their center, and their with and height: $(x_c^a,y_c^a,w^a,h^a)$.

Now, consider an anchor box with center, width and height $(x_c^a,y_c^a,w^a,h^a)$. The network will predict a transformation $(t^x, t^y, t^w, t^h)$; applying this transformation to the anchor yields a region proposal with center, width and height $(x_c^p,y_c^p,w^p,h^p)$. YOLO and Faster R-CNN use slightly different formulas to convert anchors into proposals. Here you need to implement both formulations.

YOLO¶

For YOLO, we assume that $t^x$ and $t^y$ are both in the range $-0.5\leq t^x,t^y\leq 0.5$, while $t^w$ and $t^h$ are real numbers in the range $(-\infty, \infty)$. Then we have:

  • $x_c^p = x_c^a + t^x$
  • $y_c^p = y_c^a + t^y$
  • $w^p = w_a exp(t^w)$
  • $h^p = h_a exp(t^h)$

Faster R-CNN¶

For Faster R-CNN, we assume that all transformation parameters $t^x, t^y, t^w, t_h$ are real numbers in the range $(-\infty, \infty)$. Then we have:

  • $x_c^p = x_c^a + t^xw^a$
  • $y_c^p = y_c^p + t^yh^a$
  • $w^p = w_a exp(t^w)$
  • $h^p = h_a exp(t^h)$

Training¶

During training, we compute the ground-truth transformation $(\hat{t^x}, \hat{t^y}, \hat{t^w}, \hat{t^h})$ that would transform the anchor box $(x_c^a,y_c^a,w^a,h^a)$ into the the ground-truth box $(x_c^{gt},y_c^{gt},w^{gt},h^{gt})$. We then apply a regression loss that penalizes differences between the predicted transform $(t^x, t^y, t^w, t^h)$ and the ground-truth transform.

InĀ [25]:
def GenerateProposal(anchors, offsets, method='YOLO'):
    """
    Proposal generator.

    Inputs:
    - anchors: Anchor boxes, of shape (B, A, H', W', 4). Anchors are represented
      by the coordinates of their top-left and bottom-right corners.
    - offsets: Transformations of shape (B, A, H', W', 4) that will be used to
      convert anchor boxes into region proposals. The transformation
      offsets[b, a, h, w] = (tx, ty, tw, th) will be applied to the anchor
      anchors[b, a, h, w]. For YOLO, assume that tx and ty are in the range
      (-0.5, 0.5).
    - method: Which transformation formula to use, either 'YOLO' or 'FasterRCNN'

    Outputs:
    - proposals: Region proposals of shape (B, A, H', W', 4), represented by the
      coordinates of their top-left and bottom-right corners. Applying the
      transform offsets[b, a, h, w] to the anchor [b, a, h, w] should give the
      proposal proposals[b, a, h, w].

    """
    assert(method in ['YOLO', 'FasterRCNN'])
    proposals = None
    ##############################################################################
    # TODO: Given anchor coordinates and the proposed offset for each anchor,    #
    # compute the proposal coordinates using the transformation formulas above.  #
    ##############################################################################

    coords = torch.Tensor(anchors.shape).fill_(-1.).cuda()
    proposals = torch.Tensor(anchors.shape).fill_(-1.).cuda()

    # Transform corner coordinates to center/width/height representation
    coords[..., 0] = (anchors[..., 0] + anchors[..., 2]) / 2
    coords[..., 1] = (anchors[..., 1] + anchors[..., 3]) / 2
    coords[..., 2] = anchors[..., 2] - anchors[..., 0]
    coords[..., 3] = anchors[..., 3] - anchors[..., 1]

    if method == 'YOLO':
        proposals[..., 0] = coords[..., 0] + offsets[..., 0]
        proposals[..., 1] = coords[..., 1] + offsets[..., 1]
        proposals[..., 2] = coords[..., 2] * torch.exp(offsets[..., 2])
        proposals[..., 3] = coords[..., 3] * torch.exp(offsets[..., 3])
    elif method == 'FasterRCNN':
        proposals[..., 0] = coords[..., 0] + offsets[..., 0] * coords[..., 2]
        proposals[..., 1] = coords[..., 1] + offsets[..., 1] * coords[..., 3]
        proposals[..., 2] = coords[..., 2] * torch.exp(offsets[..., 2])
        proposals[..., 3] = coords[..., 3] * torch.exp(offsets[..., 3])

    # Transform center/width/height representation back to corner coordinates
    coords[..., 0] = proposals[..., 0] - proposals[..., 2] / 2
    coords[..., 2] = proposals[..., 0] + proposals[..., 2] / 2
    coords[..., 1] = proposals[..., 1] - proposals[..., 3] / 2
    coords[..., 3] = proposals[..., 1] + proposals[..., 3] / 2
    proposals = coords  # Reassignment for return

    ##############################################################################
    #                               END OF YOUR CODE                             #
    ##############################################################################

    return proposals

Run the following to check your implementation. You should see errors on the order of 1e-6 or less.

InĀ [26]:
print('-' * 80)
print('Sanity check for YOLO.')
yolo_offset_list = torch.cat([torch.ones_like(anc_list[:, :, :, :, 0:2]).fill_(.5), torch.ones_like(anc_list[:, :, :, :, 2:4])], dim=-1)
yolo_proposal_list = GenerateProposal(anc_list, yolo_offset_list, 'YOLO') # no scaling

print('1. Center moved by ~0.5 cell')
error = rel_error(anc_list[0, 0, 0, :, 0:2] + (anc_list[0, 0, 0, :, 2:4] - anc_list[0, 0, 0, :, 0:2])/2.0 + 0.5, \
        (yolo_proposal_list[0, 0, 0, :, 0:2] + (yolo_proposal_list[0, 0, 0, :, 2:4] - yolo_proposal_list[0, 0, 0, :, 0:2]) / 2.0))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Relative Error: {error}\n{color}Result: {result}\033[0m')

print('2. w/h changed by e')
error = rel_error((anc_list[0, 0, 0, :, 2:4] - anc_list[0, 0, 0, :, 0:2]) * torch.exp(torch.ones_like(anc_list[0, 0, 0, :, 0:2])), \
        (yolo_proposal_list[0, 0, 0, :, 2:4] - yolo_proposal_list[0, 0, 0, :, 0:2]))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Relative Error: {error}\n{color}Result: {result}\033[0m')

print('-' * 80)
print('Sanity check for FasterRCNN.')
rcnn_offset_list = torch.ones_like(anc_list)
rcnn_proposal_list = GenerateProposal(anc_list, rcnn_offset_list, 'FasterRCNN')

print('1. x/y shifted by wh')
error = rel_error(anc_list[0, 0, 0, :, 0:2] + (anc_list[0, 0, 0, :, 2:4] - anc_list[0, 0, 0, :, 0:2]) * 3.0 /2.0, \
      (rcnn_proposal_list[0, 0, 0, :, 0:2] + (rcnn_proposal_list[0, 0, 0, :, 2:4] - rcnn_proposal_list[0, 0, 0, :, 0:2]) / 2.0))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Relative Error: {error}\n{color}Result: {result}\033[0m')

print('2. w/h should changed by e')
error = rel_error((anc_list[0, 0, 0, :, 2:4] - anc_list[0, 0, 0, :, 0:2]) * torch.exp(torch.ones_like(anc_list[0, 0, 0, :, 0:2])), \
        (rcnn_proposal_list[0, 0, 0, :, 2:4] - rcnn_proposal_list[0, 0, 0, :, 0:2]))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Relative Error: {error}\n{color}Result: {result}\033[0m')
--------------------------------------------------------------------------------
Sanity check for YOLO.
1. Center moved by ~0.5 cell
Relative Error: 0.0
Result: Pass
2. w/h changed by e
Relative Error: 1.7541862007419695e-07
Result: Pass
--------------------------------------------------------------------------------
Sanity check for FasterRCNN.
1. x/y shifted by wh
Relative Error: 0.0
Result: Pass
2. w/h should changed by e
Relative Error: 1.7541862007419695e-07
Result: Pass

As an additional sanity check, we visualize an anchor (in red) and the corresponding proposal (in green) that results from applying the transform $(0.5, 0.5, 0, 0)$. The proposal should shift down and to the right (when using the YOLO formulation).

InĀ [27]:
yolo_offset_list = torch.cat([torch.ones_like(anc_list[:, :, :, :, 0:2]).fill_(.5), torch.zeros_like(anc_list[:, :, :, :, 2:4])], dim=-1)
yolo_proposal_list = GenerateProposal(anc_list, yolo_offset_list, 'YOLO')

for img, anc, prop in zip(img_list, coord_trans(anc_list[:, 0:1, 3:4, 3:4, :], w_list, h_list), \
                          coord_trans(yolo_proposal_list[:, 0:1, 3:4, 3:4, :], w_list, h_list)):
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4), prop.reshape(-1, 4))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Next we visualize the effect of applying the transform $(0, 0, 1, 1)$ (with the YOLO formula) to the same anchor box (in red). Now the proposal (in green) should have the same center as the anchor, but the proposal should be larger.

InĀ [28]:
yolo_offset_list = torch.cat([torch.zeros_like(anc_list[:, :, :, :, 0:2]), torch.ones_like(anc_list[:, :, :, :, 2:4]).fill_(1.)], dim=-1)
yolo_proposal_list = GenerateProposal(anc_list, yolo_offset_list, 'YOLO')

for img, anc, prop in zip(img_list, coord_trans(anc_list[:, 0:1, 3:4, 3:4, :], w_list, h_list), \
                          coord_trans(yolo_proposal_list[:, 0:1, 3:4, 3:4, :], w_list, h_list)):
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4), prop.reshape(-1, 4))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Next to sanity-check our implementation of the Faster R-CNN transformation formulas, we visualize the effect of applying the transform $(1, 1, 0, 0)$ to the same anchor (in red). The proposal (in green) should shift down and to the right by an amount equal to the size of the anchor.

InĀ [29]:
# visualization (shift by wh, Faster R-CNN)
# anchors in red and proposals in green
rcnn_offset_list = torch.cat([torch.ones_like(anc_list[:, :, :, :, 0:2]), torch.zeros_like(anc_list[:, :, :, :, 2:4])], dim=-1)
rcnn_proposal_list = GenerateProposal(anc_list, rcnn_offset_list, 'FasterRCNN')

for img, anc, prop in zip(img_list, coord_trans(anc_list[:, 0:1, 3:4, 3:4, :], w_list, h_list), \
                          coord_trans(rcnn_proposal_list[:, 0:1, 3:4, 3:4, :], w_list, h_list)):
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4), prop.reshape(-1, 4))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

We further check our implementation of the Faster R-CNN transformation formula, and visualize the effect of applying the transformation $(0, 0, 1, 1)$ to the same anchor. Now the proposal (in green) should have the same center as the anchor (in red), but the proposal should be larger by a factor of $e$.

InĀ [30]:
# visualization (no shift and then scale by e, Faster R-CNN)
# anchors in red and proposals in green
rcnn_offset_list = torch.cat([torch.zeros_like(anc_list[:, :, :, :, 0:2]), torch.ones_like(anc_list[:, :, :, :, 2:4]).fill_(1)], dim=-1)
rcnn_proposal_list = GenerateProposal(anc_list, rcnn_offset_list, 'FasterRCNN')

for img, anc, prop in zip(img_list, coord_trans(anc_list[:, 0:1, 3:4, 3:4, :], w_list, h_list), \
                          coord_trans(rcnn_proposal_list[:, 0:1, 3:4, 3:4, :], w_list, h_list)):
  data_visualizer(img, idx_to_class, anc.reshape(-1, 4), prop.reshape(-1, 4))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Prediction Networks¶

This module outputs the prediction scores (see figure below). We have provided the code to determine activated/negative anchors for you, though you need to implement the IoU function for it to work. You will also need to compute the loss function. The loss function consists of three parts, confidence score regression, bounding box offsets regression, and object classication.

pred_scores

Image credit: towardsdatascience. In this example, number of anchor shapes is $A=2$ while we have $A=9$.

Intersection Over Union (IoU)¶

The definition of IoU and instructions on how to compute IoU can be found in the lecture slides.

InĀ [31]:
def IoU(proposals, bboxes):
    """
    Compute intersection over union between sets of bounding boxes.

    Inputs:
    - proposals: Proposals of shape (B, A, H', W', 4)
    - bboxes: Ground-truth boxes from the DataLoader of shape (B, N, 5).
      Each ground-truth box is represented as tuple (x_lr, y_lr, x_rb, y_rb, class).
      If image i has fewer than N boxes, then bboxes[i] will be padded with extra
      rows of -1.

    Outputs:
    - iou_mat: IoU matrix of shape (B, A*H'*W', N) where iou_mat[b, i, n] gives
      the IoU between one element of proposals[b] and bboxes[b, n].

    For this implementation you DO NOT need to filter invalid proposals or boxes;
    in particular you don't need any special handling for bboxxes that are padded
    with -1.
    """
    iou_mat = None
    ##############################################################################
    # TODO: Compute the Intersection over Union (IoU) on proposals and GT boxes. #
    # No need to filter invalid proposals/bboxes (i.e., allow region area <= 0). #
    # You need to ensure your implementation is efficient (no for loops).        #
    # HINT:                                                                      #
    # IoU = Area of Intersection / Area of Union, where
    # Area of Union = Area of Proposal + Area of BBox - Area of Intersection     #
    # and the Area of Intersection can be computed using the top-left corner and #
    # bottom-right corner of proposal and bbox. Think about their relationships. #
    ##############################################################################

    # Extract the tensor sizes
    B, A, H_, W_, _ = proposals.shape
    N = bboxes.shape[1]

    # Make both proposals and bboxes have the same shape
    # Note: Ignore the class label in bboxes
    proposals = proposals.view(B, A*H_*W_, 1, 4).expand(-1, -1, N, -1)  # (B, AHW, N, 4)
    bboxes = bboxes[:, None, :, :4].expand(-1, A*H_*W_, -1, -1)         # (B, AHW, N, 5)

    # Find the inner corners for intersection
    # Remove negative intersections
    min_bottom_right = torch.min(proposals[..., 2:], bboxes[..., 2:])
    max_top_left = torch.max(proposals[..., :2], bboxes[..., :2])
    intersection = torch.clamp(min_bottom_right - max_top_left, min=0)
    intersection_area = intersection[..., 0] * intersection[..., 1]

    # Find the individual areas
    proposals_area = (proposals[..., 2] - proposals[..., 0]) * (proposals[..., 3] - proposals[..., 1])
    bboxes_area = (bboxes[..., 2] - bboxes[..., 0]) * (bboxes[..., 3] - bboxes[..., 1])

    # Calculate the union area and IoU
    union_area = proposals_area + bboxes_area - intersection_area
    iou_mat = intersection_area / union_area

    ##############################################################################
    #                               END OF YOUR CODE                             #
    ##############################################################################
    return iou_mat

Run the following to check your implementation. You should see errors on the order of 1e-6 or less.

InĀ [32]:
# simple sanity check
width, height = torch.tensor([35, 35], **to_float_cuda), torch.tensor([40, 40], **to_float_cuda)
sample_bbox = torch.tensor([[[1,1,11,11,0], [20,20,30,30,0]]], **to_float_cuda)
sample_proposals = torch.tensor([[[[[5,5,15,15], [27,27,37,37]]]]], **to_float_cuda)

result = IoU(sample_proposals, sample_bbox)

# check 1
expected_result = torch.tensor([[[0.21951219, 0.00000000],
                                 [0.00000000, 0.04712042]]], **to_float_cuda)
error = rel_error(expected_result, result)
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Simple IoU Matrix Relative Error: {error}\n{color}Result: {result}\033[0m')

# check 2
iou_mat = IoU(anc_list, resized_box_list)
expected_iou_mat = torch.tensor([0.11666405, 0.15146968, 0.02956639], **to_float_cuda)
error = rel_error(expected_iou_mat, iou_mat[:, :, 0].mean(1))
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'IoU Matrix Relative Error: {error}\n{color}Result: {result}\033[0m')
Simple IoU Matrix Relative Error: 0.0
Result: Pass
IoU Matrix Relative Error: 6.299873689386004e-08
Result: Pass

Activated (positive) and negative anchors¶

During training we need to match the ground-truth boxes against the anchors to determine the classification labels for the anchors -- which anchors should be classified as containing an object and which should be classified as background? We have written this part for you.

Read and digest the input/output definition carefully. You are highly recommended to read through the code as later parts rely heavily on this function.

InĀ [33]:
def ReferenceOnActivatedAnchors(anchors, bboxes, grid, iou_mat, pos_thresh=0.7, neg_thresh=0.3, method='FasterRCNN'):
  """
  Determine the activated (positive) and negative anchors for model training.

  For YOLO - A grid cell is responsible for predicting a GT box if the center of
  the box falls into that cell.
  Implementation details: First compute manhattan distance between grid cell centers
  (BxH’xW’) and GT box centers (BxN). This gives us a matrix of shape Bx(H'xW')xN and
  perform torch.min(dim=1)[1] on it gives us the indexes indicating activated grids
  responsible for GT boxes (convert to x and y). Among all the anchors associated with
  the activate grids, the anchor with the largest IoU with the GT box is responsible to
  predict (regress to) the GT box.
  Note: One anchor might match multiple GT boxes.

  For Faster R-CNN - Positive anchors are defined Any of the two
  (i) the anchor/anchors with the highest IoU overlap with a GT box, or
  (ii) an anchor that has an IoU overlap higher than 0.7 with any GT box.
  Note: One anchor can match at most one GT box (the one with the largest IoU overlapping).

  For both - We assign a negative label to a anchor if its IoU ratio is lower than
  a threshold value for all GT boxes. Anchors that are neither positive nor negative
  do not contribute to the training objective.

  Main steps include:
  i) Decide activated and negative anchors based on the IoU matrix.
  ii) Compute GT confidence score/offsets/object class on the positive proposals.
  iii) Compute GT confidence score on the negative proposals.

  Inputs:
  - anchors: Anchor boxes, of shape BxAxH’xW’x4
  - bboxes: GT boxes of shape BxNx5, where N is the number of PADDED GT boxes,
            5 indicates (x_{lr}^{gt}, y_{lr}^{gt}, x_{rb}^{gt}, y_{rb}^{gt}) and class index
  - grid (float): A cell grid of shape BxH'xW'x2 where 2 indicate the (x, y) coord
  - iou_mat: IoU matrix of shape Bx(AxH’xW’)xN
  - pos_thresh: Positive threshold value
  - neg_thresh: Negative threshold value
  - method: Switch between 'YOLO' mode and 'FasterRCNN' mode

  Outputs:
  - activated_anc_ind: Index on activated anchors, of shape M, where M indicates the
                       number of activated anchors
  - negative_anc_ind: Index on negative anchors, of shape M
  - GT_conf_scores: GT IoU confidence scores on activated anchors, of shape M
  - GT_offsets: GT offsets on activated anchors, of shape Mx4. They are denoted as
                \hat{t^x}, \hat{t^y}, \hat{t^w}, \hat{t^h} in the formulation earlier.
  - GT_class: GT class category on activated anchors, essentially indexed from bboxes[:, :, 4],
              of shape M
  - activated_anc_coord: Coordinates on activated anchors (mainly for visualization purposes)
  - negative_anc_coord: Coordinates on negative anchors (mainly for visualization purposes)
  """

  assert(method in ['FasterRCNN', 'YOLO'])

  B, A, h_amap, w_amap, _ = anchors.shape
  N = bboxes.shape[1]

  # activated/positive anchors
  max_iou_per_anc, max_iou_per_anc_ind = iou_mat.max(dim=-1)
  if method == 'FasterRCNN':
    max_iou_per_box = iou_mat.max(dim=1, keepdim=True)[0]
    activated_anc_mask = (iou_mat == max_iou_per_box) & (max_iou_per_box > 0)
    activated_anc_mask |= (iou_mat > pos_thresh) # using the pos_thresh condition as well
    # if an anchor matches multiple GT boxes, choose the box with the largest iou
    activated_anc_mask = activated_anc_mask.max(dim=-1)[0] # Bx(AxH’xW’)
    activated_anc_ind = torch.nonzero(activated_anc_mask.view(-1)).squeeze(-1)

    # GT conf scores
    GT_conf_scores = max_iou_per_anc[activated_anc_mask] # M

    # GT class
    box_cls = bboxes[:, :, 4].view(B, 1, N).expand((B, A*h_amap*w_amap, N))
    GT_class = torch.gather(box_cls, -1, max_iou_per_anc_ind.unsqueeze(-1)).squeeze(-1) # M
    GT_class = GT_class[activated_anc_mask].long()

    bboxes_expand = bboxes[:, :, :4].view(B, 1, N, 4).expand((B, A*h_amap*w_amap, N, 4))
    bboxes = torch.gather(bboxes_expand, -2, max_iou_per_anc_ind.unsqueeze(-1) \
      .unsqueeze(-1).expand(B, A*h_amap*w_amap, 1, 4)).view(-1, 4)
    bboxes = bboxes[activated_anc_ind]
  else:
    bbox_mask = (bboxes[:, :, 0] != -1) # BxN, indicate invalid boxes
    bbox_centers = (bboxes[:, :, 2:4] - bboxes[:, :, :2]) / 2. + bboxes[:, :, :2] # BxNx2

    mah_dist = torch.abs(grid.view(B, -1, 2).unsqueeze(2) - bbox_centers.unsqueeze(1)).sum(dim=-1) # Bx(H'xW')xN
    min_mah_dist = mah_dist.min(dim=1, keepdim=True)[0] # Bx1xN
    grid_mask = (mah_dist == min_mah_dist).unsqueeze(1) # Bx1x(H'xW')xN

    reshaped_iou_mat = iou_mat.view(B, A, -1, N)
    anc_with_largest_iou = reshaped_iou_mat.max(dim=1, keepdim=True)[0] # Bx1x(H’xW’)xN
    anc_mask = (anc_with_largest_iou == reshaped_iou_mat) # BxAx(H’xW’)xN
    activated_anc_mask = (grid_mask & anc_mask).view(B, -1, N)
    activated_anc_mask &= bbox_mask.unsqueeze(1)

    # one anchor could match multiple GT boxes
    activated_anc_ind = torch.nonzero(activated_anc_mask.view(-1)).squeeze(-1)
    GT_conf_scores = iou_mat.view(-1)[activated_anc_ind]
    bboxes = bboxes.view(B, 1, N, 5).repeat(1, A*h_amap*w_amap, 1, 1).view(-1, 5)[activated_anc_ind]
    GT_class = bboxes[:, 4].long()
    bboxes = bboxes[:, :4]
    activated_anc_ind = (activated_anc_ind / activated_anc_mask.shape[-1]).long()

  print('number of pos proposals: ', activated_anc_ind.shape[0])
  activated_anc_coord = anchors.view(-1, 4)[activated_anc_ind]

  # GT offsets
  # bbox and anchor coordinates are x_tl, y_tl, x_br, y_br
  # offsets are t_x, t_y, t_w, t_h
  wh_offsets = torch.log((bboxes[:, 2:4] - bboxes[:, :2]) \
    / (activated_anc_coord[:, 2:4] - activated_anc_coord[:, :2]))

  xy_offsets = (bboxes[:, :2] + bboxes[:, 2:4] - \
    activated_anc_coord[:, :2] - activated_anc_coord[:, 2:4]) / 2.

  if method == "FasterRCNN":
    xy_offsets /= (activated_anc_coord[:, 2:4] - activated_anc_coord[:, :2])
  else:
    assert torch.max(torch.abs(xy_offsets)) <= 0.5, \
      "x and y offsets should be between -0.5 and 0.5! Got {}".format( \
      torch.max(torch.abs(xy_offsets)))

  GT_offsets = torch.cat((xy_offsets, wh_offsets), dim=-1)

  # negative anchors
  negative_anc_mask = (max_iou_per_anc < neg_thresh) # Bx(AxH’xW’)
  negative_anc_ind = torch.nonzero(negative_anc_mask.view(-1)).squeeze(-1)
  negative_anc_ind = negative_anc_ind[torch.randint(0, negative_anc_ind.shape[0], (activated_anc_ind.shape[0],))]
  negative_anc_coord = anchors.view(-1, 4)[negative_anc_ind.view(-1)]

  # activated_anc_coord and negative_anc_coord are mainly for visualization purposes
  return activated_anc_ind, negative_anc_ind, GT_conf_scores, GT_offsets, GT_class, \
         activated_anc_coord, negative_anc_coord

Run the following to check your implementation. You should see errors on the order of 1e-6 or less.

InĀ [34]:
# sanity check on YOLO (the one on Faster R-CNN is in A5-2)
activated_anc_ind, negative_anc_ind, GT_conf_scores, GT_offsets, GT_class, \
  activated_anc_coord, negative_anc_coord = ReferenceOnActivatedAnchors(anc_list, resized_box_list, grid_list, iou_mat, neg_thresh=0.2, method='YOLO')

expected_GT_conf_scores = torch.tensor([0.74538743, 0.72793430, 0.76044953, 0.37116671], **to_float_cuda)
expected_GT_offsets = torch.tensor([[ 0.04900002,  0.35735703, -0.09431065,  0.19244696],
                                    [-0.14700007,  0.37299442, -0.00250307,  0.25213102],
                                    [-0.40600014,  0.09625626,  0.20863886, -0.07974572],
                                    [ 0.15399981, -0.42933345, -0.03459148, -0.86750042]], **to_float_cuda)
expected_GT_class = torch.tensor([ 6,  7, 19,  6], **to_long_cuda)

error = rel_error(GT_conf_scores, expected_GT_conf_scores)
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Confidence Scores Relative Error: {error}\n{color}Result: {result}\033[0m')

error = rel_error(GT_offsets, expected_GT_offsets)
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Offsets Relative Error: {error}\n{color}Result: {result}\033[0m')

error = rel_error(GT_class, expected_GT_class)
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Class Probabilities Relative Error: {error}\n{color}Result: {result}\033[0m')
number of pos proposals:  4
Confidence Scores Relative Error: 0.0
Result: Pass
Offsets Relative Error: 7.441442448907765e-07
Result: Pass
Class Probabilities Relative Error: 0.0
Result: Pass

We can sanity check this function by visualizing ground-truth boxes (in red) along with positive / negative anchors (in green).

InĀ [35]:
# visualize activated and negative anchors
anc_per_img = torch.prod(torch.tensor(anc_list.shape[1:-1]))

print('*'*80)
print('Activated (positive) anchors:')
for img, bbox, idx in zip(img_list, box_list, torch.arange(box_list.shape[0])):
  anc_ind_in_img = (activated_anc_ind >= idx * anc_per_img) & (activated_anc_ind < (idx+1) * anc_per_img)
  print('{} activated anchors!'.format(torch.sum(anc_ind_in_img)))
  data_visualizer(img, idx_to_class, bbox[:, :4], coord_trans(activated_anc_coord[anc_ind_in_img], w_list[idx], h_list[idx]))

print('*'*80)
print('Negative anchors:')
for img, bbox, idx in zip(img_list, box_list, torch.arange(box_list.shape[0])):
  anc_ind_in_img = (negative_anc_ind >= idx * anc_per_img) & (negative_anc_ind < (idx+1) * anc_per_img)
  print('{} negative anchors!'.format(torch.sum(anc_ind_in_img)))
  data_visualizer(img, idx_to_class, bbox[:, :4], coord_trans(negative_anc_coord[anc_ind_in_img], w_list[idx], h_list[idx]))
********************************************************************************
Activated (positive) anchors:
1 activated anchors!
No description has been provided for this image
2 activated anchors!
No description has been provided for this image
1 activated anchors!
No description has been provided for this image
********************************************************************************
Negative anchors:
1 negative anchors!
No description has been provided for this image
2 negative anchors!
No description has been provided for this image
1 negative anchors!
No description has been provided for this image

Prediction Network¶

The prediction network inputs the features from the backbone network, and outputs the classification scores and transformations for each anchor.

For each position in the 7x7 grid of features from the backbone, the prediction network outputs C numbers to be interpreted as classification scores over the C object categories for the anchors at that position.

In addition, for each of the A anchors at each position, the prediction network outputs a transformation (4 numbers, to convert the anchor box into a region proposal) and a confidence score (where large positive values indicate high probability that the anchor contains an object, and large negative values indicate low probability that the anchor contains an object).

Collecting all of these outputs, we see that for each position in the 7x7 grid of features we need to output a total of 5A+C numbers, so the prediction network receives an input tensor of shape (B, 1280, 7, 7) and produces an output tensor of shape (B, 5A+C, 7, 7). We can achieve this with two 1x1 convolution layers operating on the input tensor, where the number of filters in the second layer is 5A+C.

During training, we do not apply the loss on the full set of anchor boxes for the image; instead we designate a subset of anchors as positive and negative by matching them with ground-truth boxes as in the function above. The Prediction network is also responsible for picking out the outputs corresponding to the positive and negative anchors.

InĀ [36]:
class PredictionNetwork(nn.Module):
    def __init__(self, in_dim, hidden_dim=128, num_anchors=9, num_classes=20, drop_ratio=0.3):
        super().__init__()

        assert(num_classes != 0 and num_anchors != 0)
        self.num_classes = num_classes
        self.num_anchors = num_anchors

        ##############################################################################
        # TODO: Set up a network that will predict outputs for all anchors. This     #
        # network should have a 1x1 convolution with hidden_dim filters, followed    #
        # by a Dropout layer with p=drop_ratio, a Leaky ReLU nonlinearity, and       #
        # finally another 1x1 convolution layer to predict all outputs. You can      #
        # use an nn.Sequential for this network, and store it in a member variable.  #
        # HINT: The output should be of shape (B, 5*A+C, 7, 7), where                #
        # A=self.num_anchors and C=self.num_classes.                                 #
        ##############################################################################

        self.out_dim = 5 * num_anchors + num_classes
        self.model = nn.Sequential(
          nn.Conv2d(in_channels=in_dim, out_channels=hidden_dim, kernel_size=1),
          nn.Dropout(p=drop_ratio),
          nn.LeakyReLU(),
          nn.Conv2d(in_channels=hidden_dim, out_channels=self.out_dim, kernel_size=1)
        )

        ##############################################################################
        #                               END OF YOUR CODE                             #
        ##############################################################################

    def _extract_anchor_data(self, anchor_data, anchor_idx):
        """
        Inputs:
        - anchor_data: Tensor of shape (B, A, D, H, W) giving a vector of length
          D for each of A anchors at each point in an H x W grid.
        - anchor_idx: int64 Tensor of shape (M,) giving anchor indices to extract

        Returns:
        - extracted_anchors: Tensor of shape (M, D) giving anchor data for each
          of the anchors specified by anchor_idx.
        """
        B, A, D, H, W = anchor_data.shape
        anchor_data = anchor_data.permute(0, 1, 3, 4, 2).contiguous().view(-1, D)
        extracted_anchors = anchor_data[anchor_idx]
        return extracted_anchors

    def _extract_class_scores(self, all_scores, anchor_idx):
        """
        Inputs:
        - all_scores: Tensor of shape (B, C, H, W) giving classification scores for
          C classes at each point in an H x W grid.
        - anchor_idx: int64 Tensor of shape (M,) giving the indices of anchors at
          which to extract classification scores

        Returns:
        - extracted_scores: Tensor of shape (M, C) giving the classification scores
          for each of the anchors specified by anchor_idx.
        """
        B, C, H, W = all_scores.shape
        A = self.num_anchors
        all_scores = all_scores.contiguous().permute(0, 2, 3, 1).contiguous()
        all_scores = all_scores.view(B, 1, H, W, C).expand(B, A, H, W, C)
        all_scores = all_scores.reshape(B * A * H * W, C)
        extracted_scores = all_scores[anchor_idx]
        return extracted_scores

    def forward(self, features, pos_anchor_idx=None, neg_anchor_idx=None):
        """
        Run the forward pass of the network to predict outputs given features
        from the backbone network.

        Inputs:
        - features: Tensor of shape (B, in_dim, 7, 7) giving image features computed
          by the backbone network.
        - pos_anchor_idx: int64 Tensor of shape (M,) giving the indices of anchors
          marked as positive. These are only given during training; at test-time
          this should be None.
        - neg_anchor_idx: int64 Tensor of shape (M,) giving the indices of anchors
          marked as negative. These are only given at training; at test-time this
          should be None.

        The outputs from this method are different during training and inference.

        During training, pos_anchor_idx and neg_anchor_idx are given and identify
        which anchors should be positive and negative, and this forward pass needs
        to extract only the predictions for the positive and negative anchors.

        During inference, only features are provided and this method needs to return
        predictions for all anchors.

        Outputs (During training):
        - conf_scores: Tensor of shape (2*M, 1) giving the predicted classification
          scores for positive anchors and negative anchors (in that order).
        - offsets: Tensor of shape (M, 4) giving predicted transformation for
          positive anchors.
        - class_scores: Tensor of shape (M, C) giving classification scores for
          positive anchors.

        Outputs (During inference):
        - conf_scores: Tensor of shape (B, A, H, W) giving predicted classification
          scores for all anchors.
        - offsets: Tensor of shape (B, A, 4, H, W) giving predicted transformations
          all all anchors.
        - class_scores: Tensor of shape (B, C, H, W) giving classification scores for
          each spatial position.
        """
        conf_scores, offsets, class_scores = None, None, None
        ############################################################################
        # TODO: Use backbone features to predict conf_scores, offsets, and         #
        # class_scores. Make sure conf_scores is between 0 and 1 by squashing the  #
        # network output with a sigmoid. Also make sure the first two elements t^x #
        # and t^y of offsets are between -0.5 and 0.5 by squashing with a sigmoid  #
        # and subtracting 0.5.                                                     #
        #                                                                          #
        # During training you need to extract the outputs for only the positive    #
        # and negative anchors as specified above.                                 #
        #                                                                          #
        # HINT: You can use the provided helper methods self._extract_anchor_data  #
        # and self._extract_class_scores to extract information for positive and   #
        # negative anchors specified by pos_anchor_idx and neg_anchor_idx.         #
        ############################################################################

        B, _, H, W = features.shape
        scores = self.model(features) # (B, 5*A+C, 7, 7)

        # Split scores into anchor scores and class scores
        anchor_scores = scores[:, :5*self.num_anchors, :, :]    # (B, 5*A, 7, 7)
        anchor_scores = anchor_scores.view(B, self.num_anchors, 5, 7, 7)    # (B, A, 5, 7, 7)
        class_scores = scores[:, 5*self.num_anchors:, :, :]     # (B, C, 7, 7)

        # Training: pos and neg anchors are not none
        if pos_anchor_idx is not None and neg_anchor_idx is not None:
            # Calculate positive and negative confidence scores separately then concatenate
            pos_anchor_data = self._extract_anchor_data(anchor_scores, pos_anchor_idx)    # (M, 5)
            neg_anchor_data = self._extract_anchor_data(anchor_scores, neg_anchor_idx)    # (M, 5)
            conf_scores = torch.cat((pos_anchor_data[:, 0:1], neg_anchor_data[:, 0:1]), dim=0)  # (2*M, 1)
            conf_scores = torch.sigmoid(conf_scores) # Squash with a sigmoid

            offsets = pos_anchor_data[:, 1:5]    # (M, 4)
            offsets[:, :2] = torch.sigmoid(offsets[:, :2]) - 0.5  # Normalize tx and ty

            # Format class data for _extract_class_scores
            class_scores = self._extract_class_scores(class_scores, pos_anchor_idx) # (M, C)

        # Testing: pos and neg anchors are none
        else:
            conf_scores = anchor_scores[:, :, 0, :, :]  # (B, A, 1, 7, 7)
            conf_scores = conf_scores.squeeze(2)        # (B, A, 7, 7)
            conf_scores = torch.sigmoid(conf_scores) # Squash with a sigmoid

            offsets = anchor_scores[:, :, 1:5, :, :]     # (B, A, 4, 7, 7)
            offsets[:, :, :2, :, :] = torch.sigmoid(offsets[:, :, :2, :, :]) - 0.5  # Normalize tx and ty

        ##############################################################################
        #                               END OF YOUR CODE                             #
        ##############################################################################
        return conf_scores, offsets, class_scores

Run the following to check your implementation. You should see errors on the order of 1e-4 or less.

InĀ [37]:
# sanity check
fix_random_seed(0)
pred_network = PredictionNetwork(1280, drop_ratio=0).to(**to_float_cuda)
features = torch.linspace(-10., 10., steps=3*1280*7*7, **to_float_cuda).view(3, 1280, 7, 7)
pos_anchor_idx = torch.tensor([122, 605, 871, 955], **to_long_cuda)
neg_anchor_idx = torch.tensor([1048, 1292, 1124, 1092], **to_long_cuda)
conf_scores, offsets, class_prob = pred_network(features, pos_anchor_idx, neg_anchor_idx)

expected_conf_scores = torch.tensor([[0.85080749], [0.55230302], [0.45239496], [0.51819414],
                                     [0.38467780], [0.82627463], [0.53837817], [0.538446366]], **to_float_cuda)
expected_offsets = torch.tensor([[-0.16344640,  0.45598251, -1.56108809, -1.96177566],
                                 [ 0.09087485, -0.11321104,  0.46109992,  0.13557276],
                                 [ 0.14098871, -0.04003078, -0.14689390,  0.01480492],
                                 [-0.22611487,  0.14513946, -1.26124716,  0.58137202]], **to_float_cuda)
expected_class_prob = torch.tensor([0.88649291, 1.08752346, 0.90241265, 1.28021181, 0.77324629,
                                    -0.93609941, 1.44269419, -1.01072836, 0.09888625, -0.09179375,
                                    -0.48814785, -1.14749694, 0.24533349, -0.19522685, 0.21445289,
                                    0.91779679, 0.97305167, 1.01984429, -0.11932681, 0.34998628], **to_float_cuda)

error = rel_error(conf_scores, expected_conf_scores)
result = "Pass" if error < 1e-4 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Confidence Scores Relative Error: {error}\n{color}Result: {result}\033[0m')

error = rel_error(offsets, expected_offsets)
result = "Pass" if error < 1e-4 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Offsets Relative Error: {error}\n{color}Result: {result}\033[0m')

error = rel_error(class_prob.mean(0), expected_class_prob)
result = "Pass" if error < 1e-4 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Class Probabilities Relative Error: {error}\n{color}Result: {result}\033[0m')
Confidence Scores Relative Error: 2.3242040469995118e-07
Result: Pass
Offsets Relative Error: 2.4281827791128308e-05
Result: Pass
Class Probabilities Relative Error: 1.3798310192214558e-06
Result: Pass

Loss Function¶

The confidence score regression loss is for both activated/negative anchors while the bounding box regression loss and the object classification loss are for activated anchors only. These are implemented for you.

Confidence score regression¶

InĀ [38]:
def ConfScoreRegression(conf_scores, GT_conf_scores):
  """
  Use sum-squared error as in YOLO

  Inputs:
  - conf_scores: Predicted confidence scores
  - GT_conf_scores: GT confidence scores

  Outputs:
  - conf_score_loss
  """
  # the target conf_scores for negative samples are zeros
  GT_conf_scores = torch.cat((torch.ones_like(GT_conf_scores), \
                              torch.zeros_like(GT_conf_scores)), dim=0).view(-1, 1)
  conf_score_loss = torch.sum((conf_scores - GT_conf_scores)**2) * 1. / GT_conf_scores.shape[0]
  return conf_score_loss

Bounding box regression¶

InĀ [39]:
def BboxRegression(offsets, GT_offsets):
  """"
  Use sum-squared error as in YOLO
  For both xy and wh

  Inputs:
  - offsets: Predicted box offsets
  - GT_offsets: GT box offsets

  Outputs:
  - bbox_reg_loss
  """
  bbox_reg_loss = torch.sum((offsets - GT_offsets)**2) * 1. / GT_offsets.shape[0]
  return bbox_reg_loss

Object classifiction¶

InĀ [40]:
def ObjectClassification(class_prob, GT_class, batch_size, anc_per_img, activated_anc_ind):
  """"
  Use softmax loss

  Inputs:
  - class_prob: Predicted softmax class probability
  - GT_class: GT box class label

  Outputs:
  - object_cls_loss
  """
  # average within sample and then average across batch
  # such that the class pred would not bias towards dense popular objects like `person`
  all_loss = F.cross_entropy(class_prob, GT_class, reduction='none') # , reduction='sum') * 1. / batch_size
  object_cls_loss = 0
  for idx in range(batch_size):
    anc_ind_in_img = (activated_anc_ind >= idx * anc_per_img) & (activated_anc_ind < (idx+1) * anc_per_img)
    object_cls_loss += all_loss[anc_ind_in_img].sum() * 1. / torch.sum(anc_ind_in_img)
  object_cls_loss /= batch_size
  # object_cls_loss = F.cross_entropy(class_prob, GT_class, reduction='sum') * 1. / batch_size

  return object_cls_loss

Run the following to check your implementation. You should see errors on the order of 1e-6 or less.

InĀ [41]:
# sanity check
conf_loss = ConfScoreRegression(conf_scores, GT_conf_scores)
reg_loss = BboxRegression(offsets, GT_offsets)
cls_loss = ObjectClassification(class_prob, GT_class, w_list.shape[0], anc_per_img, activated_anc_ind)
print('conf loss: {:.4f}, reg loss: {:.4f}, cls loss: {:.4f}'.format(conf_loss, reg_loss, cls_loss))

loss_all = torch.tensor([conf_loss.data, reg_loss.data, cls_loss.data], **to_float_cuda)
expected_loss = torch.tensor([0.27064770460128784, 2.9750006198883057, 2.3919472694396973], **to_float_cuda)

error = rel_error(loss_all, expected_loss)
result = "Pass" if error < 1e-6 else "Fail"
color = "\033[92m" if result == "Pass" else "\033[91m"
print(f'Loss Relative Error: {error}\n{color}Result: {result}\033[0m')
conf loss: 0.2706, reg loss: 2.9750, cls loss: 2.3919
Loss Relative Error: 1.9935103523494035e-07
Result: Pass

Train an object detector¶

Object detection module¶

We will now combine everything into the SingleStageDetector class:

InĀ [42]:
class SingleStageDetector(nn.Module):
  def __init__(self):
    super().__init__()

    self.anchor_list = torch.tensor([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [2, 3], [3, 2], [3, 5], [5, 3]]) # READ ONLY
    self.feat_extractor = FeatureExtractor()
    self.num_classes = 20
    self.pred_network = PredictionNetwork(1280, num_anchors=self.anchor_list.shape[0], \
                                          num_classes=self.num_classes)
  def forward(self):
    raise NotImplementedError

  def inference(self):
    raise NotImplementedError

Implement the forward function of our detector. This implements the training-time forward pass: it receives the input images and the ground-truth bounding boxes, and returns the total loss for the minibatch.

InĀ [43]:
  def detector_forward(self, images, bboxes):
    """
    Training-time forward pass for the single-stage detector.

    Inputs:
    - images: Input images, of shape (B, 3, 224, 224)
    - bboxes: GT bounding boxes of shape (B, N, 5) (padded)

    Outputs:
    - total_loss: Torch scalar giving the total loss for the batch.
    """
    # weights to multiple to each loss term
    w_conf = 1 # for conf_scores
    w_reg = 1 # for offsets
    w_cls = 1 # for class_prob

    total_loss = None
    ##############################################################################
    # TODO: Implement the forward pass of SingleStageDetector.                   #
    # A few key steps are outlined as follows:                                   #
    # i) Image feature extraction,                                               #
    # ii) Grid and anchor generation,                                            #
    # iii) Compute IoU between anchors and GT boxes and then determine activated/#
    #      negative anchors, and GT_conf_scores, GT_offsets, GT_class,           #
    # iv) Compute conf_scores, offsets, class_prob through the prediction network#
    # v) Compute the total_loss which is formulated as:                          #
    #    total_loss = w_conf * conf_loss + w_reg * reg_loss + w_cls * cls_loss,  #
    #    where conf_loss is determined by ConfScoreRegression, w_reg by          #
    #    BboxRegression, and w_cls by ObjectClassification.                      #
    # HINT: Set `neg_thresh=0.2` in ReferenceOnActivatedAnchors in this notebook #
    #       (A5-1) for a better performance than with the default value.         #
    ##############################################################################

    # Step i) Image feature extraction
    feat = self.feat_extractor(images)

    # Step ii) Grid and anchor generation
    B, _, H, W = feat.shape
    grid = GenerateGrid(batch_size=B, w_amap=H, h_amap=W)
    anchors = GenerateAnchor(anc=self.anchor_list.to('cuda'), grid=grid)

    # Step iii) Compute IoU between anchors and GT boxes and then determine activated/negative anchors, and GT_conf_scores, GT_offsets, GT_class
    # Note: Treat anchors as region proposals for setting up the training set
    iou_mat = IoU(proposals=anchors, bboxes=bboxes)
    activated_anc_ind, negative_anc_ind, GT_conf_scores, GT_offsets, GT_class, _, _ = ReferenceOnActivatedAnchors(anchors=anchors, bboxes=bboxes, grid=grid, iou_mat=iou_mat)

    # Step iv) Compute conf_scores, offsets, class_prob through the prediction network
    conf_scores, offsets, class_scores = self.pred_network.forward(features=feat, pos_anchor_idx=activated_anc_ind, neg_anchor_idx=negative_anc_ind)

    # Step v) Compute the total_loss
    conf_score_loss = ConfScoreRegression(conf_scores, GT_conf_scores)
    bbox_reg_loss = BboxRegression(offsets, GT_offsets)

    # Total anchors per image = A * H' * W'
    anc_per_img = anchors.shape[1] * anchors.shape[2] * anchors.shape[3]
    object_cls_loss = ObjectClassification(class_scores, GT_class, B, anc_per_img, activated_anc_ind)

    total_loss = w_conf * conf_score_loss + w_reg * bbox_reg_loss + w_cls * object_cls_loss

    ##############################################################################
    #                               END OF YOUR CODE                             #
    ##############################################################################

    return total_loss

  SingleStageDetector.forward = detector_forward

Object detection solver¶

The DetectionSolver object runs the training loop to train an single stage detector.

InĀ [44]:
def DetectionSolver(detector, train_loader, learning_rate=3e-3,
                    lr_decay=1, num_epochs=20, **kwargs):
  """
  Run optimization to train the model.
  """

  # ship model to GPU
  detector.to(**to_float_cuda)

  # optimizer setup
  from torch import optim
  # optimizer = optim.Adam(
  optimizer = optim.SGD(
    filter(lambda p: p.requires_grad, detector.parameters()),
    learning_rate) # leave betas and eps by default
  lr_scheduler = optim.lr_scheduler.LambdaLR(optimizer,
                                             lambda epoch: lr_decay ** epoch)

  # sample minibatch data
  loss_history = []
  detector.train()
  for i in range(num_epochs):
    start_t = time.time()
    for iter_num, data_batch in enumerate(train_loader):
      images, boxes, w_batch, h_batch, _ = data_batch
      resized_boxes = coord_trans(boxes, w_batch, h_batch, mode='p2a')
      images = images.to(**to_float_cuda)
      resized_boxes = resized_boxes.to(**to_float_cuda)

      loss = detector(images, resized_boxes)
      optimizer.zero_grad()
      loss.backward()
      loss_history.append(loss.item())
      optimizer.step()

      print('(Iter {} / {})'.format(iter_num, len(train_loader)))

    end_t = time.time()
    print('(Epoch {} / {}) loss: {:.4f} time per epoch: {:.1f}s'.format(
        i, num_epochs, loss.item(), end_t-start_t))

    lr_scheduler.step()

  # plot the training losses
  plt.plot(loss_history)
  plt.xlabel('Iteration')
  plt.ylabel('Loss')
  plt.title('Training loss history')
  plt.show()

Overfit small data¶

To make sure that everything is working as expected, we can try to overfit the detector to a small subset of data.

After 200 epochs of training you should see a total loss of around or less than 0.3.

InĀ [45]:
# monitor the training loss
fix_random_seed(0)
num_sample = 10
small_dataset = torch.utils.data.Subset(train_dataset, torch.linspace(0, len(train_dataset)-1, steps=num_sample).long())
small_train_loader = pascal_voc2007_loader(small_dataset, 10) # a new loader

for lr in [1e-2]:
  print('lr: ', lr)
  detector = SingleStageDetector()
  DetectionSolver(detector, small_train_loader, learning_rate=lr, num_epochs=200)
lr:  0.01
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 0 / 200) loss: 4.7055 time per epoch: 0.7s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 1 / 200) loss: 3.3176 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 2 / 200) loss: 2.7884 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 3 / 200) loss: 2.3024 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 4 / 200) loss: 1.9575 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 5 / 200) loss: 1.8149 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 6 / 200) loss: 1.6512 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 7 / 200) loss: 1.5679 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 8 / 200) loss: 1.5888 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 9 / 200) loss: 1.4474 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 10 / 200) loss: 1.2730 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 11 / 200) loss: 1.3825 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 12 / 200) loss: 1.2727 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 13 / 200) loss: 1.2793 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 14 / 200) loss: 1.3265 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 15 / 200) loss: 1.0746 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 16 / 200) loss: 1.0831 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 17 / 200) loss: 1.0438 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 18 / 200) loss: 1.0242 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 19 / 200) loss: 1.0730 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 20 / 200) loss: 0.8876 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 21 / 200) loss: 0.8964 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 22 / 200) loss: 0.8490 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 23 / 200) loss: 0.8339 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 24 / 200) loss: 1.0244 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 25 / 200) loss: 0.9089 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 26 / 200) loss: 0.8901 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 27 / 200) loss: 0.8397 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 28 / 200) loss: 0.9323 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 29 / 200) loss: 0.8734 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 30 / 200) loss: 0.7738 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 31 / 200) loss: 0.7443 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 32 / 200) loss: 0.7393 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 33 / 200) loss: 0.7780 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 34 / 200) loss: 0.7163 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 35 / 200) loss: 0.6919 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 36 / 200) loss: 0.7152 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 37 / 200) loss: 0.6678 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 38 / 200) loss: 0.6863 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 39 / 200) loss: 0.7363 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 40 / 200) loss: 0.6296 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 41 / 200) loss: 0.6489 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 42 / 200) loss: 0.6170 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 43 / 200) loss: 0.6557 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 44 / 200) loss: 0.5875 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 45 / 200) loss: 0.6708 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 46 / 200) loss: 0.6137 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 47 / 200) loss: 0.5934 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 48 / 200) loss: 0.5678 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 49 / 200) loss: 0.6098 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 50 / 200) loss: 0.6634 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 51 / 200) loss: 0.5339 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 52 / 200) loss: 0.5502 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 53 / 200) loss: 0.5678 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 54 / 200) loss: 0.5735 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 55 / 200) loss: 0.5802 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 56 / 200) loss: 0.5291 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 57 / 200) loss: 0.5338 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 58 / 200) loss: 0.6161 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 59 / 200) loss: 0.5330 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 60 / 200) loss: 0.5765 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 61 / 200) loss: 0.4776 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 62 / 200) loss: 0.4829 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 63 / 200) loss: 0.5373 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 64 / 200) loss: 0.4594 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 65 / 200) loss: 0.4720 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 66 / 200) loss: 0.5014 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 67 / 200) loss: 0.5064 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 68 / 200) loss: 0.4712 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 69 / 200) loss: 0.5442 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 70 / 200) loss: 0.4994 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 71 / 200) loss: 0.5291 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 72 / 200) loss: 0.4848 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 73 / 200) loss: 0.4090 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 74 / 200) loss: 0.5120 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 75 / 200) loss: 0.3948 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 76 / 200) loss: 0.4039 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 77 / 200) loss: 0.4117 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 78 / 200) loss: 0.4072 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 79 / 200) loss: 0.4661 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 80 / 200) loss: 0.3804 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 81 / 200) loss: 0.4173 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 82 / 200) loss: 0.4545 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 83 / 200) loss: 0.4311 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 84 / 200) loss: 0.4097 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 85 / 200) loss: 0.3794 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 86 / 200) loss: 0.4122 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 87 / 200) loss: 0.3680 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 88 / 200) loss: 0.4250 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 89 / 200) loss: 0.3600 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 90 / 200) loss: 0.4715 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 91 / 200) loss: 0.4343 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 92 / 200) loss: 0.4237 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 93 / 200) loss: 0.3751 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 94 / 200) loss: 0.4167 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 95 / 200) loss: 0.4014 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 96 / 200) loss: 0.3809 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 97 / 200) loss: 0.3886 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 98 / 200) loss: 0.4597 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 99 / 200) loss: 0.4131 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 100 / 200) loss: 0.4168 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 101 / 200) loss: 0.4119 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 102 / 200) loss: 0.4208 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 103 / 200) loss: 0.4212 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 104 / 200) loss: 0.3861 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 105 / 200) loss: 0.3687 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 106 / 200) loss: 0.3939 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 107 / 200) loss: 0.3740 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 108 / 200) loss: 0.3567 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 109 / 200) loss: 0.3658 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 110 / 200) loss: 0.3384 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 111 / 200) loss: 0.3925 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 112 / 200) loss: 0.3623 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 113 / 200) loss: 0.3816 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 114 / 200) loss: 0.3962 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 115 / 200) loss: 0.3334 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 116 / 200) loss: 0.3320 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 117 / 200) loss: 0.3400 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 118 / 200) loss: 0.3754 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 119 / 200) loss: 0.3450 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 120 / 200) loss: 0.3350 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 121 / 200) loss: 0.3191 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 122 / 200) loss: 0.3954 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 123 / 200) loss: 0.3812 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 124 / 200) loss: 0.3851 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 125 / 200) loss: 0.3645 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 126 / 200) loss: 0.3208 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 127 / 200) loss: 0.3754 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 128 / 200) loss: 0.3375 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 129 / 200) loss: 0.3686 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 130 / 200) loss: 0.3078 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 131 / 200) loss: 0.3173 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 132 / 200) loss: 0.2828 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 133 / 200) loss: 0.3723 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 134 / 200) loss: 0.3239 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 135 / 200) loss: 0.3220 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 136 / 200) loss: 0.2958 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 137 / 200) loss: 0.3092 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 138 / 200) loss: 0.3747 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 139 / 200) loss: 0.3488 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 140 / 200) loss: 0.3066 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 141 / 200) loss: 0.2979 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 142 / 200) loss: 0.3464 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 143 / 200) loss: 0.2944 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 144 / 200) loss: 0.2905 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 145 / 200) loss: 0.3088 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 146 / 200) loss: 0.2765 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 147 / 200) loss: 0.3044 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 148 / 200) loss: 0.2738 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 149 / 200) loss: 0.2975 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 150 / 200) loss: 0.3449 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 151 / 200) loss: 0.3389 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 152 / 200) loss: 0.3263 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 153 / 200) loss: 0.3293 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 154 / 200) loss: 0.3067 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 155 / 200) loss: 0.2433 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 156 / 200) loss: 0.2765 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 157 / 200) loss: 0.2699 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 158 / 200) loss: 0.2923 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 159 / 200) loss: 0.2670 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 160 / 200) loss: 0.3146 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 161 / 200) loss: 0.2842 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 162 / 200) loss: 0.2654 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 163 / 200) loss: 0.2972 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 164 / 200) loss: 0.2837 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 165 / 200) loss: 0.2673 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 166 / 200) loss: 0.2538 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 167 / 200) loss: 0.2799 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 168 / 200) loss: 0.2699 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 169 / 200) loss: 0.2911 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 170 / 200) loss: 0.2922 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 171 / 200) loss: 0.2584 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 172 / 200) loss: 0.2341 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 173 / 200) loss: 0.2772 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 174 / 200) loss: 0.2817 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 175 / 200) loss: 0.2685 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 176 / 200) loss: 0.2643 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 177 / 200) loss: 0.2794 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 178 / 200) loss: 0.2729 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 179 / 200) loss: 0.2525 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 180 / 200) loss: 0.2460 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 181 / 200) loss: 0.2761 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 182 / 200) loss: 0.2833 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 183 / 200) loss: 0.2706 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 184 / 200) loss: 0.2584 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 185 / 200) loss: 0.2362 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 186 / 200) loss: 0.2874 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 187 / 200) loss: 0.2682 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 188 / 200) loss: 0.2685 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 189 / 200) loss: 0.2504 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 190 / 200) loss: 0.2500 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 191 / 200) loss: 0.2791 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 192 / 200) loss: 0.2520 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 193 / 200) loss: 0.2915 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 194 / 200) loss: 0.2309 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 195 / 200) loss: 0.2583 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 196 / 200) loss: 0.2349 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 197 / 200) loss: 0.2555 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 198 / 200) loss: 0.2857 time per epoch: 0.1s
number of pos proposals:  50
(Iter 0 / 1)
(Epoch 199 / 200) loss: 0.2381 time per epoch: 0.1s
No description has been provided for this image

Train a net¶

Now that we are confident that the training code is working properly, let's train the network on more data and for longer. We will train for 50 epochs; this should take about 20 minutes on a T4 GPU on Google Colab. You should see a total loss around or less than 0.3.

Note that real object detection systems typically train for 12-24 hours and distribute training over multiple GPUs. As such our result will be far from the state of the art, but it should give some reasonable results!

InĀ [46]:
# monitor the training loss
train_loader = pascal_voc2007_loader(train_dataset, 100) # a new loader

lr = 5e-2
num_epochs = 50
yolo_detector = SingleStageDetector()
DetectionSolver(yolo_detector, train_loader, learning_rate=lr, num_epochs=num_epochs)
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 0 / 50) loss: 2.2848 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 1 / 50) loss: 1.6205 time per epoch: 23.4s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 2 / 50) loss: 1.2404 time per epoch: 24.4s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 3 / 50) loss: 1.0612 time per epoch: 24.1s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 4 / 50) loss: 0.8194 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 5 / 50) loss: 0.7869 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 6 / 50) loss: 0.7006 time per epoch: 23.9s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 7 / 50) loss: 0.7018 time per epoch: 25.0s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 8 / 50) loss: 0.5543 time per epoch: 24.3s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 9 / 50) loss: 0.5209 time per epoch: 23.9s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 10 / 50) loss: 0.5040 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 11 / 50) loss: 0.4371 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 12 / 50) loss: 0.4198 time per epoch: 23.9s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 13 / 50) loss: 0.4264 time per epoch: 24.3s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 14 / 50) loss: 0.3714 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 15 / 50) loss: 0.3733 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 16 / 50) loss: 0.3569 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 17 / 50) loss: 0.3523 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 18 / 50) loss: 0.3281 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 19 / 50) loss: 0.3207 time per epoch: 24.1s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 20 / 50) loss: 0.2923 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 21 / 50) loss: 0.3155 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 22 / 50) loss: 0.2986 time per epoch: 23.8s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 23 / 50) loss: 0.2658 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 24 / 50) loss: 0.2700 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 25 / 50) loss: 0.2706 time per epoch: 24.2s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 26 / 50) loss: 0.2818 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 27 / 50) loss: 0.2395 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 28 / 50) loss: 0.2299 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 29 / 50) loss: 0.2487 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 30 / 50) loss: 0.2412 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 31 / 50) loss: 0.2322 time per epoch: 24.3s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 32 / 50) loss: 0.2120 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 33 / 50) loss: 0.2250 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 34 / 50) loss: 0.1981 time per epoch: 23.5s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 35 / 50) loss: 0.2044 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 36 / 50) loss: 0.2041 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 37 / 50) loss: 0.1874 time per epoch: 24.2s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 38 / 50) loss: 0.2101 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 39 / 50) loss: 0.1956 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 40 / 50) loss: 0.2072 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 41 / 50) loss: 0.1954 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 42 / 50) loss: 0.1936 time per epoch: 24.1s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 43 / 50) loss: 0.1952 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 44 / 50) loss: 0.1751 time per epoch: 23.7s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 45 / 50) loss: 0.1829 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 46 / 50) loss: 0.1743 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 47 / 50) loss: 0.1730 time per epoch: 23.6s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 48 / 50) loss: 0.1677 time per epoch: 24.4s
number of pos proposals:  348
(Iter 0 / 25)
number of pos proposals:  410
(Iter 1 / 25)
number of pos proposals:  375
(Iter 2 / 25)
number of pos proposals:  362
(Iter 3 / 25)
number of pos proposals:  348
(Iter 4 / 25)
number of pos proposals:  316
(Iter 5 / 25)
number of pos proposals:  379
(Iter 6 / 25)
number of pos proposals:  362
(Iter 7 / 25)
number of pos proposals:  368
(Iter 8 / 25)
number of pos proposals:  363
(Iter 9 / 25)
number of pos proposals:  325
(Iter 10 / 25)
number of pos proposals:  355
(Iter 11 / 25)
number of pos proposals:  346
(Iter 12 / 25)
number of pos proposals:  363
(Iter 13 / 25)
number of pos proposals:  357
(Iter 14 / 25)
number of pos proposals:  349
(Iter 15 / 25)
number of pos proposals:  370
(Iter 16 / 25)
number of pos proposals:  367
(Iter 17 / 25)
number of pos proposals:  395
(Iter 18 / 25)
number of pos proposals:  386
(Iter 19 / 25)
number of pos proposals:  392
(Iter 20 / 25)
number of pos proposals:  405
(Iter 21 / 25)
number of pos proposals:  335
(Iter 22 / 25)
number of pos proposals:  359
(Iter 23 / 25)
number of pos proposals:  376
(Iter 24 / 25)
(Epoch 49 / 50) loss: 0.1809 time per epoch: 23.7s
No description has been provided for this image
InĀ [47]:
# (optional) load/save checkpoint
# torch.save(yolo_detector.state_dict(), 'yolo_detector.pt') # uncomment to save your checkpoint

# yolo_detector = SingleStageDetector()
# yolo_detector.load_state_dict(torch.load('yolo_detector.pt')) # uncomment to load your previous checkpoint

Use an object detector¶

Thresholding¶

We will implement this in the object detection module.

Non-Maximum Suppression (NMS)¶

The definition of NMS and instructions on how to compute NMS can be found in the lecture slides.

InĀ [48]:
def nms(boxes, scores, iou_threshold=0.5, topk=None):
    """
    Non-maximum suppression removes overlapping bounding boxes.

    Inputs:
    - boxes: top-left and bottom-right coordinate values of the bounding boxes
      to perform NMS on, of shape Nx4
    - scores: scores for each one of the boxes, of shape N
    - iou_threshold: discards all overlapping boxes with IoU > iou_threshold; float
    - topk: If this is not None, then return only the topk highest-scoring boxes.
      Otherwise if this is None, then return all boxes that pass NMS.

    Outputs:
    - keep: torch.long tensor with the indices of the elements that have been
      kept by NMS, sorted in decreasing order of scores; of shape [num_kept_boxes]
    """

    if (not boxes.numel()) or (not scores.numel()):
        return torch.zeros(0, dtype=torch.long)

    keep = None
    #############################################################################
    # TODO: Implement non-maximum suppression which iterates the following:     #
    #       1. Select the highest-scoring box among the remaining ones,         #
    #          which has not been chosen in this step before                    #
    #       2. Eliminate boxes with IoU > threshold                             #
    #       3. If any boxes remain, GOTO 1                                      #
    #       Your implementation should not depend on a specific device type;    #
    #       you can use the device of the input if necessary.                   #
    # HINT: You can refer to the torchvision library code:                      #
    #   github.com/pytorch/vision/blob/master/torchvision/csrc/cpu/nms_cpu.cpp  #
    #############################################################################

    # Helper function for finding the IoU between the highest-scoring box and all others
    def iou_helper(reference, candidates):
        """
        Compute the IoU between two set of bounding boxes

        Inputs:
        - reference: A single bounding box with dimension (1, 4)
        - candidates: Multiple bounding boxes with dimension (A, 4)

        Output:
        - ious: Tensor of IoUs between the reference and candidates with dimension (A, 1)
        """

        # Find the inner corners of the intersection
        min_bottom_right = torch.min(reference[:, 2:], candidates[:, 2:])
        max_top_left = torch.max(reference[:, :2], candidates[:, :2])

        # Remove negative intersections
        intersection = torch.clamp(min_bottom_right - max_top_left, min=0)
        intersection_area = intersection[:, 0] * intersection[:, 1]

        # Find the individual areas
        reference_area = ((reference[:, 2]-reference[:, 0]) * (reference[:, 3]-reference[:, 1]))
        candidates_area = ((candidates[:, 2]-candidates[:, 0]) * (candidates[:, 3]-candidates[:, 1]))

        # Calculate the union area by adding a dimension to reference_area so it can be broadcast
        union_area = reference_area.unsqueeze(1) + candidates_area - intersection_area

        return intersection_area / union_area

    # Sort all bounding boxes by descending score
    scores, idx = scores.sort(descending=True)
    boxes = boxes[idx]

    # Iterate through all boxes until they're all kept or eliminated
    keep = []
    while boxes.size(0):
        # Process the remaining box with the highest score
        current = boxes[0].unsqueeze(0)

        # Store the index of the box with highest score in keep
        keep.append(idx[0].item())

        # Stop if current is the last box (no need to eliminate the others)
        if boxes.size(0) == 1:
            break

        # Calculate the IoU of the current box compared to all other boxes
        ious = iou_helper(current, boxes[1:])

        # Keep boxes with IoU less than the overlap threshold
        remaining = (ious < iou_threshold).squeeze()
        boxes = boxes[1:][remaining]
        idx = idx[1:][remaining]

        # If the top K results have been found
        if topk is not None and len(keep) >= topk:
            break

    keep = torch.tensor(keep, dtype=torch.long)

    #############################################################################
    #                              END OF YOUR CODE                             #
    #############################################################################
    return keep

We will now compare your implementation of NMS with the implementation in torchvision. Most likely, your implementation will be faster on CPU than on CUDA, and the torchvision implementation will likely be much faster than yours. This is expected, but your implementation should produce the same outputs as the torchvision version.

InĀ [49]:
fix_random_seed(0)
boxes = (100. * torch.rand(5000, 4)).round()
boxes[:,2] = boxes[:,2] + boxes[:,0] + 1.
boxes[:,3] = boxes[:,3] + boxes[:,1] + 1.
scores = torch.randn(5000)

names = ['your_cpu', 'torchvision_cpu', 'torchvision_cuda']
iou_thresholds = [0.3, 0.5, 0.7]
elapsed = dict(zip(names, [0.]*len(names)))
intersects = dict(zip(names[1:], [0.]*(len(names)-1)))

for iou_threshold in iou_thresholds:
  tic = time.time()
  my_keep = nms(boxes, scores, iou_threshold)
  elapsed['your_cpu'] += time.time() - tic

  tic = time.time()
  tv_keep = torchvision.ops.nms(boxes, scores, iou_threshold)
  elapsed['torchvision_cpu'] += time.time() - tic
  intersect = len(set(tv_keep.tolist()).intersection(my_keep.tolist()))
  intersects['torchvision_cpu'] += intersect / (len(my_keep) + len(tv_keep) - intersect)

  tic = time.time()
  tv_cuda_keep = torchvision.ops.nms(boxes.cuda(), scores.cuda(), iou_threshold).to(my_keep.device)
  torch.cuda.synchronize()
  elapsed['torchvision_cuda'] += time.time() - tic
  intersect = len(set(tv_cuda_keep.tolist()).intersection(my_keep.tolist()))
  intersects['torchvision_cuda'] += intersect / (len(my_keep) + len(tv_cuda_keep) - intersect)

for key in intersects:
  intersects[key] /= len(iou_thresholds)

# You should see < 1% difference
print('Testing NMS:')
print('Your        CPU  implementation: %fs' % elapsed['your_cpu'])
print('torchvision CPU  implementation: %fs' % elapsed['torchvision_cpu'])
print('torchvision CUDA implementation: %fs' % elapsed['torchvision_cuda'])
print('Speedup CPU : %fx' % (elapsed['your_cpu'] / elapsed['torchvision_cpu']))
print('Speedup CUDA: %fx' % (elapsed['your_cpu'] / elapsed['torchvision_cuda']))
print('Difference CPU : ', 1. - intersects['torchvision_cpu']) # in the order of 1e-3 or less
print('Difference CUDA: ', 1. - intersects['torchvision_cuda']) # in the order of 1e-3 or less
Testing NMS:
Your        CPU  implementation: 1.308229s
torchvision CPU  implementation: 0.073471s
torchvision CUDA implementation: 0.046161s
Speedup CPU : 17.806107x
Speedup CUDA: 28.340471x
Difference CPU :  0.002000423413535235
Difference CUDA:  0.005151022027271801

Inference¶

Now, implement the inference part of module SingleStageDetector.

InĀ [56]:
def detector_inference(self, images, thresh=0.5, nms_thresh=0.7):
    """"
    Inference-time forward pass for the single stage detector.

    Inputs:
    - images: Input images
    - thresh: Threshold value on confidence scores
    - nms_thresh: Threshold value on NMS

    Outputs:
    - final_propsals: Keeped proposals after confidence score thresholding and NMS,
                            a list of B (*x4) tensors
    - final_conf_scores: Corresponding confidence scores, a list of B (*x1) tensors
    - final_class: Corresponding class predictions, a list of B  (*x1) tensors
    """
    final_proposals, final_conf_scores, final_class = [], [], []
    ##############################################################################
    # TODO: Predicting the final proposal coordinates `final_proposals`,         #
    # confidence scores `final_conf_scores`, and the class index `final_class`.  #
    # The overall steps are similar to the forward pass but now you do not need  #
    # to decide the activated nor negative anchors.                              #
    # HINT: Thresholding the conf_scores based on the threshold value `thresh`.  #
    # Then, apply NMS (torchvision.ops.nms) to the filtered proposals given the  #
    # threshold `nms_thresh`.                                                    #
    # The class index is determined by the class with the maximal probability.   #
    # Note that `final_propsals`, `final_conf_scores`, and `final_class` are all #
    # lists of B 2-D tensors (you may need to unsqueeze dim=1 for the last two). #
    ##############################################################################

    with torch.no_grad():
        # Image feature extraction (same as train)
        features = self.feat_extractor(images)
        B, _, H, W = features.shape     # 10, _, 7, 7

        # Grid and anchor generation (same as train)
        grid = GenerateGrid(batch_size=B, w_amap=H, h_amap=W)
        anchors = GenerateAnchor(anc=self.anchor_list.to('cuda'), grid=grid)
        A = anchors.shape[1]    # 9

        # Compute conf_scores, offsets, class_prob through the prediction network
        conf_scores, offsets, class_probs = self.pred_network(features)
        C = class_probs.shape[1]    # 20

        # Skip deciding the activated and negative anchors

        # Generate proposals using the predicted offsets
        offsets = offsets.permute(0, 1, 3, 4, 2)  # (B, A, 4, H, W) --> (B, A, H, W, 4)
        proposals = GenerateProposal(anchors, offsets, method='YOLO')   # (B, A, H, W, 4)

        # Threshold the confidence scores then apply NMS
        # Note: Do this step one image at a time because the number of bounding boxes per image can change a lot
        for b in range(B):
            # conf_scores[b] --> ( 9, 7, 7)
            # proposals[b]   --> ( 9, 7, 7, 4)
            # class_probs[b] --> (20, 7, 7)

            # Flatten the scores, proposals, and class probabilities for easier comparison
            flat_conf = conf_scores[b].reshape(-1)              # (A*H*W) = (441)
            flat_proposals = proposals[b].reshape(-1, 4)        # (A*H*W, 4) = (441, 4)

            flat_class_probs = class_probs[b].permute(1, 2, 0)  # (H, W, C) = (7, 7, 20)
            flat_class_probs = flat_class_probs.unsqueeze(0).repeat(A, 1, 1, 1) # (A, H, W, C) = (9, 7, 7, 20)
            flat_class_probs = flat_class_probs.reshape(-1, C)  # (A*H*W, C) = (441, 20)

            # Filter out low confidence scores
            conf_mask = flat_conf > thresh
            filtered_conf = flat_conf[conf_mask]                # (441)
            filtered_proposals = flat_proposals[conf_mask]      # (441, 4)
            filtered_class_probs = flat_class_probs[conf_mask]  # (441, 20)

            # Apply NMS
            keep = nms(boxes=filtered_proposals, scores=filtered_conf, iou_threshold=nms_thresh)
            final_conf_scores.append(filtered_conf[keep].unsqueeze(-1).detach().cpu())  # (keep, 1)
            final_proposals.append(filtered_proposals[keep].detach().cpu())             # (keep, 4)
            final_class.append(torch.argmax(filtered_class_probs[keep], dim=1).unsqueeze(-1).detach().cpu())    # (keep, 1)

    ##############################################################################
    #                               END OF YOUR CODE                             #
    ##############################################################################
    return final_proposals, final_conf_scores, final_class

SingleStageDetector.inference = detector_inference
InĀ [57]:
def DetectionInference(detector, data_loader, dataset, idx_to_class, thresh=0.8, nms_thresh=0.3, output_dir=None):

  # ship model to GPU
  detector.to(**to_float_cuda)

  detector.eval()
  start_t = time.time()

  if output_dir is not None:
    det_dir = 'mAP/input/detection-results'
    gt_dir = 'mAP/input/ground-truth'
    if os.path.exists(det_dir):
      shutil.rmtree(det_dir)
    os.mkdir(det_dir)
    if os.path.exists(gt_dir):
      shutil.rmtree(gt_dir)
    os.mkdir(gt_dir)

  for iter_num, data_batch in enumerate(data_loader):
    images, boxes, w_batch, h_batch, img_ids = data_batch
    images = images.to(**to_float_cuda)

    final_proposals, final_conf_scores, final_class = detector.inference(images, thresh=thresh, nms_thresh=nms_thresh)

    # clamp on the proposal coordinates
    batch_size = len(images)
    for idx in range(batch_size):
      torch.clamp_(final_proposals[idx][:, 0::2], min=0, max=w_batch[idx])
      torch.clamp_(final_proposals[idx][:, 1::2], min=0, max=h_batch[idx])

      # visualization
      # get the original image
      # hack to get the original image so we don't have to load from local again...
      i = batch_size*iter_num + idx
      img, _ = dataset.__getitem__(i)

      valid_box = sum([1 if j != -1 else 0 for j in boxes[idx][:, 0]])
      final_all = torch.cat((final_proposals[idx], \
        final_class[idx].float(), final_conf_scores[idx]), dim=-1).cpu()
      resized_proposals = coord_trans(final_all, w_batch[idx], h_batch[idx])

      # write results to file for evaluation (use mAP API https://github.com/Cartucho/mAP for now...)
      if output_dir is not None:
        file_name = img_ids[idx].replace('.jpg', '.txt')
        with open(os.path.join(det_dir, file_name), 'w') as f_det, \
          open(os.path.join(gt_dir, file_name), 'w') as f_gt:
          print('{}: {} GT bboxes and {} proposals'.format(img_ids[idx], valid_box, resized_proposals.shape[0]))
          for b in boxes[idx][:valid_box]:
            f_gt.write('{} {:.2f} {:.2f} {:.2f} {:.2f}\n'.format(idx_to_class[b[4].item()], b[0], b[1], b[2], b[3]))
          for b in resized_proposals:
            f_det.write('{} {:.6f} {:.2f} {:.2f} {:.2f} {:.2f}\n'.format(idx_to_class[b[4].item()], b[5], b[0], b[1], b[2], b[3]))
      else:
        data_visualizer(img, idx_to_class, boxes[idx][:valid_box], resized_proposals)

  end_t = time.time()
  print('Total inference time: {:.1f}s'.format(end_t-start_t))

Inference - overfit small data¶

InĀ [58]:
# visualize the output from the overfitted model on small dataset
# the bounding boxes should be really accurate
DetectionInference(detector, small_train_loader, small_dataset, idx_to_class, thresh=0.8)
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Total inference time: 2.3s

Inference - train a net¶

InĀ [59]:
# visualize the same output from the model trained on the entire training set
# some bounding boxes might not make sense
DetectionInference(yolo_detector, small_train_loader, small_dataset, idx_to_class)
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Total inference time: 2.9s

Evaluation¶

The definition of mean Average Precision (mAP) cna be seen in the lecture slides.

Run the following to evaluate your detector on the PASCAL VOC validation set. You should see mAP at around 11% or above.

The state of the art on this dataset is >80% mAP! To achieve these results we would need to use a much bigger network, and train with more data and for much longer, but that is beyond the scope of this assigment.

(Optional) If you train the model longer (e.g., 100 epochs), you should see a better mAP. But make sure you revert the code back for grading purposes.

InĀ [54]:
# Solve bug from mAP repo
# !pip install matplotlib==3.5.3
InĀ [60]:
DetectionInference(yolo_detector, val_loader, val_dataset, idx_to_class, output_dir='mAP/input', thresh=0.8, nms_thresh=0.3)
# DetectionInference(yolo_detector, train_loader, train_dataset, idx_to_class, output_dir='mAP/input', thresh=0.8, nms_thresh=0.3) # uncomment to see training mAP
!cd mAP && python main.py
000005.jpg: 5 GT bboxes and 30 proposals
000007.jpg: 1 GT bboxes and 1 proposals
000009.jpg: 4 GT bboxes and 7 proposals
000016.jpg: 1 GT bboxes and 1 proposals
000019.jpg: 2 GT bboxes and 1 proposals
000020.jpg: 1 GT bboxes and 1 proposals
000021.jpg: 4 GT bboxes and 6 proposals
000024.jpg: 1 GT bboxes and 3 proposals
000030.jpg: 3 GT bboxes and 6 proposals
000039.jpg: 1 GT bboxes and 5 proposals
000041.jpg: 3 GT bboxes and 10 proposals
000046.jpg: 1 GT bboxes and 3 proposals
000050.jpg: 10 GT bboxes and 21 proposals
000051.jpg: 3 GT bboxes and 1 proposals
000052.jpg: 6 GT bboxes and 0 proposals
000060.jpg: 5 GT bboxes and 3 proposals
000063.jpg: 2 GT bboxes and 1 proposals
000065.jpg: 1 GT bboxes and 2 proposals
000072.jpg: 2 GT bboxes and 7 proposals
000081.jpg: 9 GT bboxes and 20 proposals
000093.jpg: 2 GT bboxes and 1 proposals
000095.jpg: 2 GT bboxes and 1 proposals
000099.jpg: 1 GT bboxes and 3 proposals
000101.jpg: 2 GT bboxes and 2 proposals
000102.jpg: 2 GT bboxes and 6 proposals
000107.jpg: 3 GT bboxes and 17 proposals
000109.jpg: 1 GT bboxes and 2 proposals
000110.jpg: 3 GT bboxes and 1 proposals
000113.jpg: 1 GT bboxes and 5 proposals
000117.jpg: 1 GT bboxes and 3 proposals
000118.jpg: 1 GT bboxes and 3 proposals
000120.jpg: 1 GT bboxes and 1 proposals
000121.jpg: 2 GT bboxes and 1 proposals
000123.jpg: 1 GT bboxes and 1 proposals
000125.jpg: 4 GT bboxes and 10 proposals
000130.jpg: 1 GT bboxes and 17 proposals
000131.jpg: 3 GT bboxes and 9 proposals
000132.jpg: 1 GT bboxes and 2 proposals
000142.jpg: 1 GT bboxes and 3 proposals
000143.jpg: 1 GT bboxes and 4 proposals
000146.jpg: 1 GT bboxes and 3 proposals
000150.jpg: 5 GT bboxes and 4 proposals
000156.jpg: 3 GT bboxes and 3 proposals
000158.jpg: 1 GT bboxes and 1 proposals
000165.jpg: 1 GT bboxes and 3 proposals
000169.jpg: 6 GT bboxes and 6 proposals
000170.jpg: 6 GT bboxes and 7 proposals
000177.jpg: 9 GT bboxes and 27 proposals
000180.jpg: 1 GT bboxes and 3 proposals
000184.jpg: 4 GT bboxes and 11 proposals
000190.jpg: 13 GT bboxes and 13 proposals
000203.jpg: 1 GT bboxes and 8 proposals
000208.jpg: 6 GT bboxes and 16 proposals
000210.jpg: 4 GT bboxes and 10 proposals
000211.jpg: 1 GT bboxes and 10 proposals
000214.jpg: 1 GT bboxes and 1 proposals
000215.jpg: 1 GT bboxes and 1 proposals
000218.jpg: 3 GT bboxes and 5 proposals
000221.jpg: 1 GT bboxes and 1 proposals
000224.jpg: 2 GT bboxes and 12 proposals
000229.jpg: 11 GT bboxes and 31 proposals
000232.jpg: 5 GT bboxes and 5 proposals
000233.jpg: 2 GT bboxes and 3 proposals
000236.jpg: 1 GT bboxes and 3 proposals
000241.jpg: 3 GT bboxes and 15 proposals
000244.jpg: 1 GT bboxes and 1 proposals
000245.jpg: 2 GT bboxes and 3 proposals
000246.jpg: 1 GT bboxes and 1 proposals
000249.jpg: 8 GT bboxes and 15 proposals
000251.jpg: 7 GT bboxes and 16 proposals
000257.jpg: 3 GT bboxes and 5 proposals
000266.jpg: 2 GT bboxes and 1 proposals
000268.jpg: 2 GT bboxes and 2 proposals
000269.jpg: 10 GT bboxes and 18 proposals
000270.jpg: 1 GT bboxes and 4 proposals
000275.jpg: 2 GT bboxes and 8 proposals
000285.jpg: 4 GT bboxes and 7 proposals
000289.jpg: 1 GT bboxes and 14 proposals
000298.jpg: 1 GT bboxes and 1 proposals
000302.jpg: 7 GT bboxes and 19 proposals
000303.jpg: 6 GT bboxes and 2 proposals
000304.jpg: 1 GT bboxes and 1 proposals
000305.jpg: 2 GT bboxes and 2 proposals
000308.jpg: 6 GT bboxes and 16 proposals
000318.jpg: 2 GT bboxes and 5 proposals
000321.jpg: 1 GT bboxes and 5 proposals
000322.jpg: 1 GT bboxes and 2 proposals
000323.jpg: 2 GT bboxes and 2 proposals
000328.jpg: 8 GT bboxes and 14 proposals
000329.jpg: 3 GT bboxes and 1 proposals
000332.jpg: 1 GT bboxes and 2 proposals
000336.jpg: 1 GT bboxes and 1 proposals
000338.jpg: 2 GT bboxes and 2 proposals
000340.jpg: 2 GT bboxes and 1 proposals
000343.jpg: 1 GT bboxes and 1 proposals
000352.jpg: 5 GT bboxes and 21 proposals
000354.jpg: 1 GT bboxes and 1 proposals
000363.jpg: 2 GT bboxes and 6 proposals
000373.jpg: 1 GT bboxes and 4 proposals
000374.jpg: 10 GT bboxes and 30 proposals
000380.jpg: 1 GT bboxes and 0 proposals
000381.jpg: 5 GT bboxes and 9 proposals
000396.jpg: 1 GT bboxes and 4 proposals
000403.jpg: 1 GT bboxes and 1 proposals
000408.jpg: 1 GT bboxes and 3 proposals
000417.jpg: 1 GT bboxes and 1 proposals
000419.jpg: 4 GT bboxes and 8 proposals
000420.jpg: 1 GT bboxes and 1 proposals
000424.jpg: 4 GT bboxes and 5 proposals
000427.jpg: 1 GT bboxes and 2 proposals
000428.jpg: 3 GT bboxes and 15 proposals
000433.jpg: 2 GT bboxes and 3 proposals
000435.jpg: 2 GT bboxes and 3 proposals
000439.jpg: 1 GT bboxes and 8 proposals
000443.jpg: 2 GT bboxes and 11 proposals
000448.jpg: 11 GT bboxes and 23 proposals
000459.jpg: 2 GT bboxes and 1 proposals
000460.jpg: 1 GT bboxes and 4 proposals
000461.jpg: 1 GT bboxes and 3 proposals
000462.jpg: 1 GT bboxes and 1 proposals
000464.jpg: 2 GT bboxes and 5 proposals
000480.jpg: 4 GT bboxes and 5 proposals
000482.jpg: 3 GT bboxes and 2 proposals
000483.jpg: 2 GT bboxes and 5 proposals
000486.jpg: 1 GT bboxes and 2 proposals
000491.jpg: 1 GT bboxes and 1 proposals
000492.jpg: 4 GT bboxes and 20 proposals
000494.jpg: 1 GT bboxes and 4 proposals
000498.jpg: 2 GT bboxes and 3 proposals
000499.jpg: 2 GT bboxes and 3 proposals
000500.jpg: 8 GT bboxes and 12 proposals
000501.jpg: 1 GT bboxes and 1 proposals
000509.jpg: 1 GT bboxes and 1 proposals
000513.jpg: 1 GT bboxes and 0 proposals
000514.jpg: 1 GT bboxes and 1 proposals
000515.jpg: 4 GT bboxes and 5 proposals
000520.jpg: 1 GT bboxes and 2 proposals
000523.jpg: 7 GT bboxes and 8 proposals
000530.jpg: 5 GT bboxes and 9 proposals
000531.jpg: 5 GT bboxes and 17 proposals
000540.jpg: 1 GT bboxes and 1 proposals
000543.jpg: 3 GT bboxes and 9 proposals
000545.jpg: 7 GT bboxes and 5 proposals
000563.jpg: 1 GT bboxes and 8 proposals
000564.jpg: 10 GT bboxes and 35 proposals
000579.jpg: 6 GT bboxes and 10 proposals
000581.jpg: 1 GT bboxes and 1 proposals
000582.jpg: 1 GT bboxes and 2 proposals
000588.jpg: 7 GT bboxes and 15 proposals
000591.jpg: 10 GT bboxes and 12 proposals
000598.jpg: 3 GT bboxes and 9 proposals
000599.jpg: 2 GT bboxes and 6 proposals
000601.jpg: 3 GT bboxes and 9 proposals
000608.jpg: 2 GT bboxes and 4 proposals
000610.jpg: 1 GT bboxes and 2 proposals
000613.jpg: 17 GT bboxes and 24 proposals
000619.jpg: 1 GT bboxes and 3 proposals
000626.jpg: 4 GT bboxes and 2 proposals
000628.jpg: 5 GT bboxes and 14 proposals
000637.jpg: 1 GT bboxes and 5 proposals
000645.jpg: 2 GT bboxes and 1 proposals
000647.jpg: 1 GT bboxes and 1 proposals
000653.jpg: 6 GT bboxes and 8 proposals
000656.jpg: 1 GT bboxes and 2 proposals
000660.jpg: 2 GT bboxes and 2 proposals
000661.jpg: 3 GT bboxes and 7 proposals
000663.jpg: 6 GT bboxes and 1 proposals
000667.jpg: 2 GT bboxes and 4 proposals
000675.jpg: 3 GT bboxes and 2 proposals
000676.jpg: 1 GT bboxes and 1 proposals
000677.jpg: 1 GT bboxes and 3 proposals
000682.jpg: 1 GT bboxes and 1 proposals
000684.jpg: 9 GT bboxes and 25 proposals
000686.jpg: 2 GT bboxes and 18 proposals
000690.jpg: 3 GT bboxes and 7 proposals
000694.jpg: 5 GT bboxes and 17 proposals
000702.jpg: 6 GT bboxes and 6 proposals
000705.jpg: 1 GT bboxes and 0 proposals
000707.jpg: 3 GT bboxes and 11 proposals
000712.jpg: 1 GT bboxes and 1 proposals
000713.jpg: 2 GT bboxes and 4 proposals
000714.jpg: 1 GT bboxes and 7 proposals
000717.jpg: 9 GT bboxes and 26 proposals
000720.jpg: 1 GT bboxes and 1 proposals
000728.jpg: 1 GT bboxes and 1 proposals
000730.jpg: 1 GT bboxes and 2 proposals
000738.jpg: 1 GT bboxes and 2 proposals
000742.jpg: 4 GT bboxes and 8 proposals
000746.jpg: 1 GT bboxes and 1 proposals
000748.jpg: 1 GT bboxes and 3 proposals
000750.jpg: 1 GT bboxes and 2 proposals
000752.jpg: 3 GT bboxes and 8 proposals
000755.jpg: 28 GT bboxes and 12 proposals
000756.jpg: 1 GT bboxes and 2 proposals
000760.jpg: 10 GT bboxes and 9 proposals
000763.jpg: 1 GT bboxes and 7 proposals
000771.jpg: 2 GT bboxes and 1 proposals
000772.jpg: 1 GT bboxes and 1 proposals
000776.jpg: 1 GT bboxes and 1 proposals
000777.jpg: 2 GT bboxes and 3 proposals
000780.jpg: 7 GT bboxes and 29 proposals
000782.jpg: 2 GT bboxes and 2 proposals
000786.jpg: 3 GT bboxes and 7 proposals
000787.jpg: 1 GT bboxes and 1 proposals
000791.jpg: 1 GT bboxes and 1 proposals
000794.jpg: 1 GT bboxes and 20 proposals
000797.jpg: 3 GT bboxes and 4 proposals
000799.jpg: 2 GT bboxes and 4 proposals
000800.jpg: 4 GT bboxes and 16 proposals
000802.jpg: 2 GT bboxes and 3 proposals
000806.jpg: 2 GT bboxes and 7 proposals
000808.jpg: 1 GT bboxes and 1 proposals
000814.jpg: 2 GT bboxes and 7 proposals
000815.jpg: 2 GT bboxes and 5 proposals
000816.jpg: 2 GT bboxes and 12 proposals
000826.jpg: 1 GT bboxes and 3 proposals
000831.jpg: 1 GT bboxes and 2 proposals
000832.jpg: 1 GT bboxes and 5 proposals
000834.jpg: 6 GT bboxes and 10 proposals
000842.jpg: 2 GT bboxes and 2 proposals
000843.jpg: 2 GT bboxes and 10 proposals
000847.jpg: 2 GT bboxes and 2 proposals
000848.jpg: 5 GT bboxes and 18 proposals
000854.jpg: 8 GT bboxes and 24 proposals
000855.jpg: 7 GT bboxes and 7 proposals
000857.jpg: 1 GT bboxes and 7 proposals
000862.jpg: 2 GT bboxes and 5 proposals
000863.jpg: 2 GT bboxes and 1 proposals
000868.jpg: 2 GT bboxes and 14 proposals
000872.jpg: 2 GT bboxes and 6 proposals
000874.jpg: 1 GT bboxes and 1 proposals
000876.jpg: 2 GT bboxes and 1 proposals
000878.jpg: 2 GT bboxes and 14 proposals
000879.jpg: 2 GT bboxes and 3 proposals
000880.jpg: 5 GT bboxes and 3 proposals
000882.jpg: 1 GT bboxes and 2 proposals
000885.jpg: 2 GT bboxes and 2 proposals
000895.jpg: 2 GT bboxes and 7 proposals
000896.jpg: 1 GT bboxes and 2 proposals
000903.jpg: 2 GT bboxes and 2 proposals
000911.jpg: 4 GT bboxes and 18 proposals
000917.jpg: 3 GT bboxes and 8 proposals
000918.jpg: 2 GT bboxes and 4 proposals
000920.jpg: 2 GT bboxes and 2 proposals
000921.jpg: 3 GT bboxes and 3 proposals
000923.jpg: 6 GT bboxes and 5 proposals
000926.jpg: 9 GT bboxes and 3 proposals
000931.jpg: 1 GT bboxes and 7 proposals
000934.jpg: 1 GT bboxes and 4 proposals
000935.jpg: 6 GT bboxes and 2 proposals
000937.jpg: 4 GT bboxes and 6 proposals
000946.jpg: 2 GT bboxes and 9 proposals
000947.jpg: 1 GT bboxes and 2 proposals
000948.jpg: 3 GT bboxes and 1 proposals
000949.jpg: 4 GT bboxes and 10 proposals
000971.jpg: 11 GT bboxes and 20 proposals
000972.jpg: 1 GT bboxes and 6 proposals
000973.jpg: 1 GT bboxes and 5 proposals
000982.jpg: 4 GT bboxes and 7 proposals
001004.jpg: 1 GT bboxes and 1 proposals
001009.jpg: 2 GT bboxes and 2 proposals
001012.jpg: 1 GT bboxes and 6 proposals
001017.jpg: 2 GT bboxes and 5 proposals
001018.jpg: 10 GT bboxes and 22 proposals
001027.jpg: 7 GT bboxes and 13 proposals
001028.jpg: 6 GT bboxes and 9 proposals
001041.jpg: 1 GT bboxes and 3 proposals
001042.jpg: 6 GT bboxes and 12 proposals
001045.jpg: 1 GT bboxes and 3 proposals
001052.jpg: 1 GT bboxes and 2 proposals
001053.jpg: 1 GT bboxes and 2 proposals
001056.jpg: 2 GT bboxes and 4 proposals
001061.jpg: 3 GT bboxes and 5 proposals
001062.jpg: 1 GT bboxes and 1 proposals
001066.jpg: 2 GT bboxes and 5 proposals
001069.jpg: 2 GT bboxes and 14 proposals
001072.jpg: 2 GT bboxes and 3 proposals
001074.jpg: 1 GT bboxes and 2 proposals
001083.jpg: 1 GT bboxes and 3 proposals
001084.jpg: 2 GT bboxes and 3 proposals
001091.jpg: 9 GT bboxes and 34 proposals
001092.jpg: 2 GT bboxes and 4 proposals
001093.jpg: 4 GT bboxes and 2 proposals
001097.jpg: 5 GT bboxes and 6 proposals
001102.jpg: 3 GT bboxes and 0 proposals
001104.jpg: 1 GT bboxes and 4 proposals
001107.jpg: 1 GT bboxes and 2 proposals
001109.jpg: 2 GT bboxes and 3 proposals
001110.jpg: 2 GT bboxes and 2 proposals
001121.jpg: 1 GT bboxes and 1 proposals
001124.jpg: 2 GT bboxes and 2 proposals
001125.jpg: 5 GT bboxes and 23 proposals
001136.jpg: 10 GT bboxes and 8 proposals
001137.jpg: 2 GT bboxes and 7 proposals
001142.jpg: 7 GT bboxes and 2 proposals
001143.jpg: 1 GT bboxes and 4 proposals
001144.jpg: 1 GT bboxes and 1 proposals
001145.jpg: 4 GT bboxes and 12 proposals
001148.jpg: 1 GT bboxes and 0 proposals
001149.jpg: 3 GT bboxes and 8 proposals
001154.jpg: 2 GT bboxes and 6 proposals
001160.jpg: 1 GT bboxes and 1 proposals
001161.jpg: 1 GT bboxes and 0 proposals
001164.jpg: 9 GT bboxes and 23 proposals
001166.jpg: 1 GT bboxes and 14 proposals
001170.jpg: 3 GT bboxes and 4 proposals
001175.jpg: 3 GT bboxes and 15 proposals
001176.jpg: 7 GT bboxes and 1 proposals
001184.jpg: 1 GT bboxes and 0 proposals
001185.jpg: 4 GT bboxes and 4 proposals
001186.jpg: 2 GT bboxes and 2 proposals
001187.jpg: 3 GT bboxes and 5 proposals
001192.jpg: 2 GT bboxes and 6 proposals
001199.jpg: 2 GT bboxes and 1 proposals
001200.jpg: 1 GT bboxes and 1 proposals
001201.jpg: 2 GT bboxes and 6 proposals
001203.jpg: 1 GT bboxes and 2 proposals
001206.jpg: 2 GT bboxes and 8 proposals
001211.jpg: 3 GT bboxes and 2 proposals
001215.jpg: 1 GT bboxes and 4 proposals
001221.jpg: 3 GT bboxes and 1 proposals
001224.jpg: 10 GT bboxes and 36 proposals
001225.jpg: 1 GT bboxes and 4 proposals
001231.jpg: 3 GT bboxes and 16 proposals
001233.jpg: 1 GT bboxes and 1 proposals
001236.jpg: 2 GT bboxes and 3 proposals
001241.jpg: 8 GT bboxes and 13 proposals
001247.jpg: 1 GT bboxes and 11 proposals
001250.jpg: 1 GT bboxes and 2 proposals
001254.jpg: 2 GT bboxes and 6 proposals
001259.jpg: 3 GT bboxes and 11 proposals
001260.jpg: 1 GT bboxes and 1 proposals
001265.jpg: 1 GT bboxes and 1 proposals
001266.jpg: 3 GT bboxes and 10 proposals
001272.jpg: 3 GT bboxes and 2 proposals
001274.jpg: 1 GT bboxes and 2 proposals
001277.jpg: 1 GT bboxes and 2 proposals
001281.jpg: 2 GT bboxes and 4 proposals
001284.jpg: 6 GT bboxes and 24 proposals
001286.jpg: 1 GT bboxes and 1 proposals
001288.jpg: 3 GT bboxes and 5 proposals
001289.jpg: 1 GT bboxes and 3 proposals
001290.jpg: 1 GT bboxes and 2 proposals
001292.jpg: 5 GT bboxes and 7 proposals
001293.jpg: 1 GT bboxes and 2 proposals
001298.jpg: 4 GT bboxes and 3 proposals
001310.jpg: 5 GT bboxes and 17 proposals
001311.jpg: 10 GT bboxes and 14 proposals
001316.jpg: 1 GT bboxes and 2 proposals
001324.jpg: 2 GT bboxes and 4 proposals
001330.jpg: 4 GT bboxes and 5 proposals
001337.jpg: 2 GT bboxes and 4 proposals
001341.jpg: 1 GT bboxes and 1 proposals
001343.jpg: 5 GT bboxes and 14 proposals
001350.jpg: 5 GT bboxes and 10 proposals
001352.jpg: 35 GT bboxes and 23 proposals
001360.jpg: 1 GT bboxes and 2 proposals
001361.jpg: 1 GT bboxes and 1 proposals
001362.jpg: 2 GT bboxes and 1 proposals
001371.jpg: 5 GT bboxes and 15 proposals
001375.jpg: 1 GT bboxes and 1 proposals
001383.jpg: 1 GT bboxes and 1 proposals
001386.jpg: 5 GT bboxes and 3 proposals
001387.jpg: 2 GT bboxes and 2 proposals
001397.jpg: 1 GT bboxes and 3 proposals
001400.jpg: 1 GT bboxes and 6 proposals
001413.jpg: 9 GT bboxes and 4 proposals
001430.jpg: 7 GT bboxes and 21 proposals
001432.jpg: 1 GT bboxes and 5 proposals
001439.jpg: 2 GT bboxes and 16 proposals
001441.jpg: 7 GT bboxes and 28 proposals
001443.jpg: 2 GT bboxes and 3 proposals
001444.jpg: 7 GT bboxes and 19 proposals
001445.jpg: 6 GT bboxes and 11 proposals
001460.jpg: 2 GT bboxes and 5 proposals
001463.jpg: 2 GT bboxes and 5 proposals
001464.jpg: 37 GT bboxes and 0 proposals
001465.jpg: 8 GT bboxes and 27 proposals
001466.jpg: 1 GT bboxes and 9 proposals
001467.jpg: 1 GT bboxes and 2 proposals
001472.jpg: 19 GT bboxes and 12 proposals
001475.jpg: 2 GT bboxes and 9 proposals
001481.jpg: 1 GT bboxes and 6 proposals
001484.jpg: 2 GT bboxes and 0 proposals
001490.jpg: 3 GT bboxes and 1 proposals
001493.jpg: 5 GT bboxes and 19 proposals
001497.jpg: 8 GT bboxes and 9 proposals
001509.jpg: 1 GT bboxes and 5 proposals
001510.jpg: 4 GT bboxes and 5 proposals
001514.jpg: 3 GT bboxes and 2 proposals
001522.jpg: 2 GT bboxes and 13 proposals
001523.jpg: 2 GT bboxes and 11 proposals
001531.jpg: 4 GT bboxes and 11 proposals
001536.jpg: 2 GT bboxes and 0 proposals
001537.jpg: 4 GT bboxes and 8 proposals
001541.jpg: 1 GT bboxes and 1 proposals
001543.jpg: 2 GT bboxes and 4 proposals
001544.jpg: 1 GT bboxes and 1 proposals
001545.jpg: 1 GT bboxes and 5 proposals
001553.jpg: 2 GT bboxes and 1 proposals
001554.jpg: 2 GT bboxes and 7 proposals
001561.jpg: 5 GT bboxes and 8 proposals
001565.jpg: 2 GT bboxes and 3 proposals
001571.jpg: 4 GT bboxes and 3 proposals
001577.jpg: 10 GT bboxes and 25 proposals
001582.jpg: 2 GT bboxes and 7 proposals
001588.jpg: 3 GT bboxes and 9 proposals
001595.jpg: 2 GT bboxes and 20 proposals
001598.jpg: 15 GT bboxes and 13 proposals
001603.jpg: 6 GT bboxes and 10 proposals
001608.jpg: 1 GT bboxes and 6 proposals
001614.jpg: 4 GT bboxes and 6 proposals
001617.jpg: 8 GT bboxes and 13 proposals
001618.jpg: 1 GT bboxes and 6 proposals
001628.jpg: 2 GT bboxes and 5 proposals
001632.jpg: 1 GT bboxes and 2 proposals
001638.jpg: 1 GT bboxes and 4 proposals
001640.jpg: 5 GT bboxes and 1 proposals
001642.jpg: 1 GT bboxes and 1 proposals
001647.jpg: 1 GT bboxes and 5 proposals
001653.jpg: 2 GT bboxes and 2 proposals
001675.jpg: 1 GT bboxes and 2 proposals
001677.jpg: 2 GT bboxes and 19 proposals
001678.jpg: 6 GT bboxes and 7 proposals
001682.jpg: 3 GT bboxes and 2 proposals
001685.jpg: 2 GT bboxes and 3 proposals
001686.jpg: 1 GT bboxes and 4 proposals
001689.jpg: 3 GT bboxes and 2 proposals
001691.jpg: 15 GT bboxes and 10 proposals
001693.jpg: 1 GT bboxes and 2 proposals
001718.jpg: 1 GT bboxes and 1 proposals
001724.jpg: 1 GT bboxes and 1 proposals
001725.jpg: 4 GT bboxes and 1 proposals
001726.jpg: 4 GT bboxes and 12 proposals
001727.jpg: 4 GT bboxes and 3 proposals
001730.jpg: 3 GT bboxes and 7 proposals
001746.jpg: 3 GT bboxes and 15 proposals
001747.jpg: 1 GT bboxes and 1 proposals
001749.jpg: 1 GT bboxes and 4 proposals
001755.jpg: 2 GT bboxes and 1 proposals
001756.jpg: 6 GT bboxes and 10 proposals
001771.jpg: 3 GT bboxes and 1 proposals
001772.jpg: 1 GT bboxes and 2 proposals
001775.jpg: 2 GT bboxes and 2 proposals
001778.jpg: 1 GT bboxes and 1 proposals
001782.jpg: 1 GT bboxes and 1 proposals
001784.jpg: 1 GT bboxes and 1 proposals
001785.jpg: 1 GT bboxes and 1 proposals
001793.jpg: 3 GT bboxes and 9 proposals
001795.jpg: 1 GT bboxes and 6 proposals
001797.jpg: 3 GT bboxes and 2 proposals
001799.jpg: 5 GT bboxes and 15 proposals
001801.jpg: 14 GT bboxes and 17 proposals
001807.jpg: 6 GT bboxes and 13 proposals
001816.jpg: 1 GT bboxes and 1 proposals
001818.jpg: 1 GT bboxes and 1 proposals
001827.jpg: 1 GT bboxes and 30 proposals
001830.jpg: 1 GT bboxes and 1 proposals
001833.jpg: 2 GT bboxes and 6 proposals
001837.jpg: 5 GT bboxes and 11 proposals
001842.jpg: 4 GT bboxes and 1 proposals
001847.jpg: 2 GT bboxes and 1 proposals
001849.jpg: 5 GT bboxes and 10 proposals
001855.jpg: 1 GT bboxes and 4 proposals
001860.jpg: 8 GT bboxes and 5 proposals
001862.jpg: 2 GT bboxes and 2 proposals
001872.jpg: 1 GT bboxes and 4 proposals
001875.jpg: 1 GT bboxes and 9 proposals
001877.jpg: 1 GT bboxes and 2 proposals
001878.jpg: 1 GT bboxes and 3 proposals
001882.jpg: 2 GT bboxes and 4 proposals
001887.jpg: 18 GT bboxes and 4 proposals
001888.jpg: 1 GT bboxes and 1 proposals
001899.jpg: 13 GT bboxes and 17 proposals
001901.jpg: 5 GT bboxes and 9 proposals
001907.jpg: 1 GT bboxes and 1 proposals
001911.jpg: 1 GT bboxes and 6 proposals
001918.jpg: 2 GT bboxes and 4 proposals
001920.jpg: 4 GT bboxes and 8 proposals
001927.jpg: 2 GT bboxes and 3 proposals
001931.jpg: 1 GT bboxes and 2 proposals
001932.jpg: 3 GT bboxes and 17 proposals
001933.jpg: 1 GT bboxes and 1 proposals
001934.jpg: 1 GT bboxes and 1 proposals
001936.jpg: 3 GT bboxes and 9 proposals
001940.jpg: 2 GT bboxes and 1 proposals
001944.jpg: 7 GT bboxes and 3 proposals
001948.jpg: 1 GT bboxes and 1 proposals
001958.jpg: 13 GT bboxes and 17 proposals
001962.jpg: 2 GT bboxes and 3 proposals
001964.jpg: 7 GT bboxes and 3 proposals
001970.jpg: 1 GT bboxes and 1 proposals
001972.jpg: 1 GT bboxes and 2 proposals
001976.jpg: 2 GT bboxes and 5 proposals
001982.jpg: 1 GT bboxes and 1 proposals
002000.jpg: 2 GT bboxes and 10 proposals
002011.jpg: 1 GT bboxes and 2 proposals
002019.jpg: 1 GT bboxes and 1 proposals
002021.jpg: 3 GT bboxes and 1 proposals
002022.jpg: 6 GT bboxes and 16 proposals
002023.jpg: 1 GT bboxes and 3 proposals
002024.jpg: 4 GT bboxes and 7 proposals
002030.jpg: 10 GT bboxes and 26 proposals
002036.jpg: 1 GT bboxes and 3 proposals
002045.jpg: 3 GT bboxes and 6 proposals
002054.jpg: 1 GT bboxes and 1 proposals
002058.jpg: 1 GT bboxes and 1 proposals
002063.jpg: 7 GT bboxes and 23 proposals
002064.jpg: 5 GT bboxes and 4 proposals
002067.jpg: 1 GT bboxes and 1 proposals
002070.jpg: 1 GT bboxes and 0 proposals
002082.jpg: 2 GT bboxes and 3 proposals
002083.jpg: 1 GT bboxes and 6 proposals
002086.jpg: 2 GT bboxes and 1 proposals
002088.jpg: 1 GT bboxes and 2 proposals
002090.jpg: 2 GT bboxes and 1 proposals
002091.jpg: 5 GT bboxes and 5 proposals
002094.jpg: 1 GT bboxes and 3 proposals
002098.jpg: 2 GT bboxes and 19 proposals
002099.jpg: 1 GT bboxes and 2 proposals
002101.jpg: 1 GT bboxes and 3 proposals
002102.jpg: 1 GT bboxes and 1 proposals
002109.jpg: 1 GT bboxes and 1 proposals
002112.jpg: 1 GT bboxes and 1 proposals
002114.jpg: 3 GT bboxes and 4 proposals
002124.jpg: 3 GT bboxes and 7 proposals
002125.jpg: 1 GT bboxes and 2 proposals
002129.jpg: 4 GT bboxes and 1 proposals
002135.jpg: 7 GT bboxes and 12 proposals
002136.jpg: 1 GT bboxes and 2 proposals
002140.jpg: 1 GT bboxes and 5 proposals
002142.jpg: 3 GT bboxes and 17 proposals
002145.jpg: 2 GT bboxes and 1 proposals
002146.jpg: 1 GT bboxes and 1 proposals
002152.jpg: 1 GT bboxes and 5 proposals
002163.jpg: 1 GT bboxes and 4 proposals
002165.jpg: 1 GT bboxes and 2 proposals
002169.jpg: 1 GT bboxes and 5 proposals
002171.jpg: 2 GT bboxes and 4 proposals
002174.jpg: 10 GT bboxes and 4 proposals
002181.jpg: 1 GT bboxes and 8 proposals
002183.jpg: 2 GT bboxes and 4 proposals
002184.jpg: 2 GT bboxes and 2 proposals
002190.jpg: 8 GT bboxes and 6 proposals
002201.jpg: 1 GT bboxes and 1 proposals
002202.jpg: 1 GT bboxes and 1 proposals
002209.jpg: 1 GT bboxes and 1 proposals
002213.jpg: 2 GT bboxes and 2 proposals
002214.jpg: 4 GT bboxes and 5 proposals
002218.jpg: 4 GT bboxes and 3 proposals
002220.jpg: 3 GT bboxes and 3 proposals
002226.jpg: 15 GT bboxes and 10 proposals
002228.jpg: 2 GT bboxes and 0 proposals
002233.jpg: 5 GT bboxes and 6 proposals
002244.jpg: 11 GT bboxes and 15 proposals
002248.jpg: 1 GT bboxes and 1 proposals
002251.jpg: 1 GT bboxes and 4 proposals
002257.jpg: 1 GT bboxes and 7 proposals
002259.jpg: 1 GT bboxes and 0 proposals
002261.jpg: 2 GT bboxes and 1 proposals
002263.jpg: 1 GT bboxes and 6 proposals
002266.jpg: 2 GT bboxes and 2 proposals
002267.jpg: 3 GT bboxes and 7 proposals
002268.jpg: 3 GT bboxes and 3 proposals
002270.jpg: 1 GT bboxes and 9 proposals
002272.jpg: 2 GT bboxes and 3 proposals
002273.jpg: 2 GT bboxes and 11 proposals
002276.jpg: 1 GT bboxes and 2 proposals
002278.jpg: 1 GT bboxes and 1 proposals
002281.jpg: 2 GT bboxes and 2 proposals
002285.jpg: 2 GT bboxes and 7 proposals
002288.jpg: 5 GT bboxes and 14 proposals
002290.jpg: 14 GT bboxes and 17 proposals
002300.jpg: 4 GT bboxes and 10 proposals
002302.jpg: 2 GT bboxes and 2 proposals
002305.jpg: 2 GT bboxes and 5 proposals
002308.jpg: 2 GT bboxes and 3 proposals
002324.jpg: 3 GT bboxes and 4 proposals
002328.jpg: 1 GT bboxes and 4 proposals
002329.jpg: 4 GT bboxes and 11 proposals
002330.jpg: 2 GT bboxes and 8 proposals
002332.jpg: 4 GT bboxes and 2 proposals
002333.jpg: 5 GT bboxes and 8 proposals
002337.jpg: 2 GT bboxes and 5 proposals
002340.jpg: 2 GT bboxes and 5 proposals
002343.jpg: 3 GT bboxes and 2 proposals
002345.jpg: 1 GT bboxes and 2 proposals
002348.jpg: 2 GT bboxes and 1 proposals
002352.jpg: 2 GT bboxes and 5 proposals
002361.jpg: 2 GT bboxes and 14 proposals
002364.jpg: 1 GT bboxes and 1 proposals
002366.jpg: 2 GT bboxes and 1 proposals
002367.jpg: 2 GT bboxes and 2 proposals
002369.jpg: 1 GT bboxes and 2 proposals
002371.jpg: 1 GT bboxes and 1 proposals
002372.jpg: 2 GT bboxes and 2 proposals
002374.jpg: 2 GT bboxes and 4 proposals
002375.jpg: 1 GT bboxes and 5 proposals
002376.jpg: 1 GT bboxes and 6 proposals
002377.jpg: 1 GT bboxes and 1 proposals
002378.jpg: 6 GT bboxes and 8 proposals
002382.jpg: 3 GT bboxes and 5 proposals
002385.jpg: 11 GT bboxes and 33 proposals
002387.jpg: 4 GT bboxes and 5 proposals
002391.jpg: 1 GT bboxes and 1 proposals
002393.jpg: 5 GT bboxes and 8 proposals
002404.jpg: 5 GT bboxes and 10 proposals
002407.jpg: 1 GT bboxes and 1 proposals
002415.jpg: 1 GT bboxes and 0 proposals
002417.jpg: 1 GT bboxes and 1 proposals
002425.jpg: 4 GT bboxes and 18 proposals
002427.jpg: 3 GT bboxes and 1 proposals
002435.jpg: 2 GT bboxes and 1 proposals
002437.jpg: 1 GT bboxes and 1 proposals
002441.jpg: 2 GT bboxes and 1 proposals
002444.jpg: 4 GT bboxes and 23 proposals
002450.jpg: 2 GT bboxes and 4 proposals
002452.jpg: 1 GT bboxes and 1 proposals
002454.jpg: 1 GT bboxes and 1 proposals
002456.jpg: 3 GT bboxes and 8 proposals
002459.jpg: 1 GT bboxes and 1 proposals
002460.jpg: 2 GT bboxes and 7 proposals
002462.jpg: 1 GT bboxes and 2 proposals
002470.jpg: 1 GT bboxes and 2 proposals
002476.jpg: 2 GT bboxes and 4 proposals
002477.jpg: 3 GT bboxes and 5 proposals
002479.jpg: 3 GT bboxes and 11 proposals
002491.jpg: 2 GT bboxes and 6 proposals
002492.jpg: 3 GT bboxes and 23 proposals
002493.jpg: 1 GT bboxes and 1 proposals
002497.jpg: 5 GT bboxes and 6 proposals
002504.jpg: 15 GT bboxes and 13 proposals
002505.jpg: 2 GT bboxes and 2 proposals
002508.jpg: 1 GT bboxes and 1 proposals
002513.jpg: 8 GT bboxes and 2 proposals
002520.jpg: 5 GT bboxes and 16 proposals
002523.jpg: 1 GT bboxes and 3 proposals
002524.jpg: 1 GT bboxes and 2 proposals
002525.jpg: 1 GT bboxes and 1 proposals
002529.jpg: 2 GT bboxes and 5 proposals
002537.jpg: 1 GT bboxes and 1 proposals
002540.jpg: 3 GT bboxes and 8 proposals
002542.jpg: 12 GT bboxes and 18 proposals
002546.jpg: 1 GT bboxes and 1 proposals
002549.jpg: 1 GT bboxes and 2 proposals
002561.jpg: 4 GT bboxes and 8 proposals
002563.jpg: 4 GT bboxes and 11 proposals
002565.jpg: 2 GT bboxes and 1 proposals
002566.jpg: 8 GT bboxes and 8 proposals
002567.jpg: 1 GT bboxes and 1 proposals
002578.jpg: 1 GT bboxes and 1 proposals
002584.jpg: 5 GT bboxes and 13 proposals
002585.jpg: 4 GT bboxes and 9 proposals
002586.jpg: 1 GT bboxes and 1 proposals
002589.jpg: 8 GT bboxes and 18 proposals
002593.jpg: 1 GT bboxes and 2 proposals
002598.jpg: 1 GT bboxes and 0 proposals
002600.jpg: 1 GT bboxes and 2 proposals
002605.jpg: 6 GT bboxes and 4 proposals
002606.jpg: 5 GT bboxes and 11 proposals
002613.jpg: 6 GT bboxes and 21 proposals
002615.jpg: 2 GT bboxes and 3 proposals
002618.jpg: 1 GT bboxes and 1 proposals
002621.jpg: 2 GT bboxes and 4 proposals
002632.jpg: 1 GT bboxes and 1 proposals
002633.jpg: 2 GT bboxes and 1 proposals
002636.jpg: 8 GT bboxes and 25 proposals
002637.jpg: 2 GT bboxes and 3 proposals
002641.jpg: 4 GT bboxes and 5 proposals
002643.jpg: 4 GT bboxes and 10 proposals
002646.jpg: 1 GT bboxes and 1 proposals
002649.jpg: 4 GT bboxes and 11 proposals
002657.jpg: 3 GT bboxes and 13 proposals
002658.jpg: 8 GT bboxes and 19 proposals
002659.jpg: 1 GT bboxes and 1 proposals
002667.jpg: 1 GT bboxes and 1 proposals
002668.jpg: 6 GT bboxes and 6 proposals
002670.jpg: 2 GT bboxes and 2 proposals
002675.jpg: 2 GT bboxes and 6 proposals
002677.jpg: 1 GT bboxes and 1 proposals
002678.jpg: 5 GT bboxes and 13 proposals
002689.jpg: 1 GT bboxes and 3 proposals
002690.jpg: 1 GT bboxes and 1 proposals
002693.jpg: 6 GT bboxes and 18 proposals
002695.jpg: 3 GT bboxes and 6 proposals
002696.jpg: 3 GT bboxes and 4 proposals
002699.jpg: 1 GT bboxes and 7 proposals
002706.jpg: 1 GT bboxes and 1 proposals
002709.jpg: 1 GT bboxes and 1 proposals
002714.jpg: 1 GT bboxes and 3 proposals
002717.jpg: 1 GT bboxes and 4 proposals
002718.jpg: 1 GT bboxes and 2 proposals
002721.jpg: 1 GT bboxes and 6 proposals
002723.jpg: 5 GT bboxes and 11 proposals
002727.jpg: 3 GT bboxes and 9 proposals
002732.jpg: 1 GT bboxes and 1 proposals
002734.jpg: 3 GT bboxes and 6 proposals
002741.jpg: 5 GT bboxes and 18 proposals
002747.jpg: 2 GT bboxes and 2 proposals
002751.jpg: 5 GT bboxes and 21 proposals
002760.jpg: 2 GT bboxes and 2 proposals
002762.jpg: 2 GT bboxes and 0 proposals
002767.jpg: 7 GT bboxes and 21 proposals
002772.jpg: 1 GT bboxes and 3 proposals
002775.jpg: 3 GT bboxes and 12 proposals
002776.jpg: 6 GT bboxes and 15 proposals
002784.jpg: 1 GT bboxes and 2 proposals
002785.jpg: 1 GT bboxes and 1 proposals
002786.jpg: 2 GT bboxes and 4 proposals
002794.jpg: 1 GT bboxes and 1 proposals
002798.jpg: 13 GT bboxes and 30 proposals
002800.jpg: 2 GT bboxes and 11 proposals
002803.jpg: 7 GT bboxes and 3 proposals
002810.jpg: 1 GT bboxes and 1 proposals
002812.jpg: 3 GT bboxes and 13 proposals
002815.jpg: 1 GT bboxes and 1 proposals
002827.jpg: 4 GT bboxes and 17 proposals
002833.jpg: 1 GT bboxes and 1 proposals
002835.jpg: 1 GT bboxes and 3 proposals
002836.jpg: 2 GT bboxes and 10 proposals
002838.jpg: 3 GT bboxes and 1 proposals
002842.jpg: 2 GT bboxes and 2 proposals
002847.jpg: 1 GT bboxes and 4 proposals
002854.jpg: 1 GT bboxes and 10 proposals
002859.jpg: 9 GT bboxes and 8 proposals
002875.jpg: 1 GT bboxes and 1 proposals
002879.jpg: 1 GT bboxes and 2 proposals
002880.jpg: 1 GT bboxes and 1 proposals
002884.jpg: 2 GT bboxes and 7 proposals
002886.jpg: 4 GT bboxes and 10 proposals
002889.jpg: 2 GT bboxes and 15 proposals
002891.jpg: 1 GT bboxes and 1 proposals
002893.jpg: 1 GT bboxes and 3 proposals
002896.jpg: 1 GT bboxes and 0 proposals
002901.jpg: 3 GT bboxes and 1 proposals
002910.jpg: 2 GT bboxes and 9 proposals
002912.jpg: 2 GT bboxes and 3 proposals
002913.jpg: 10 GT bboxes and 5 proposals
002915.jpg: 3 GT bboxes and 3 proposals
002916.jpg: 2 GT bboxes and 7 proposals
002917.jpg: 4 GT bboxes and 4 proposals
002924.jpg: 2 GT bboxes and 4 proposals
002932.jpg: 1 GT bboxes and 6 proposals
002933.jpg: 3 GT bboxes and 2 proposals
002935.jpg: 3 GT bboxes and 3 proposals
002938.jpg: 1 GT bboxes and 9 proposals
002940.jpg: 7 GT bboxes and 12 proposals
002941.jpg: 4 GT bboxes and 6 proposals
002942.jpg: 1 GT bboxes and 2 proposals
002943.jpg: 4 GT bboxes and 9 proposals
002944.jpg: 1 GT bboxes and 1 proposals
002946.jpg: 1 GT bboxes and 2 proposals
002947.jpg: 2 GT bboxes and 2 proposals
002952.jpg: 3 GT bboxes and 3 proposals
002954.jpg: 2 GT bboxes and 4 proposals
002960.jpg: 1 GT bboxes and 2 proposals
002963.jpg: 1 GT bboxes and 1 proposals
002965.jpg: 26 GT bboxes and 47 proposals
002966.jpg: 1 GT bboxes and 1 proposals
002967.jpg: 3 GT bboxes and 3 proposals
002977.jpg: 2 GT bboxes and 2 proposals
002978.jpg: 3 GT bboxes and 10 proposals
002984.jpg: 3 GT bboxes and 0 proposals
002986.jpg: 15 GT bboxes and 29 proposals
002994.jpg: 2 GT bboxes and 0 proposals
003000.jpg: 1 GT bboxes and 6 proposals
003004.jpg: 5 GT bboxes and 9 proposals
003005.jpg: 3 GT bboxes and 4 proposals
003008.jpg: 1 GT bboxes and 0 proposals
003009.jpg: 1 GT bboxes and 2 proposals
003015.jpg: 1 GT bboxes and 2 proposals
003017.jpg: 2 GT bboxes and 5 proposals
003021.jpg: 1 GT bboxes and 9 proposals
003023.jpg: 3 GT bboxes and 13 proposals
003028.jpg: 1 GT bboxes and 1 proposals
003031.jpg: 2 GT bboxes and 1 proposals
003032.jpg: 3 GT bboxes and 3 proposals
003038.jpg: 1 GT bboxes and 4 proposals
003039.jpg: 2 GT bboxes and 8 proposals
003044.jpg: 5 GT bboxes and 10 proposals
003045.jpg: 1 GT bboxes and 1 proposals
003054.jpg: 2 GT bboxes and 1 proposals
003056.jpg: 13 GT bboxes and 12 proposals
003057.jpg: 3 GT bboxes and 11 proposals
003058.jpg: 1 GT bboxes and 2 proposals
003064.jpg: 1 GT bboxes and 5 proposals
003065.jpg: 6 GT bboxes and 15 proposals
003072.jpg: 1 GT bboxes and 1 proposals
003078.jpg: 10 GT bboxes and 12 proposals
003082.jpg: 2 GT bboxes and 5 proposals
003086.jpg: 1 GT bboxes and 4 proposals
003089.jpg: 3 GT bboxes and 4 proposals
003090.jpg: 1 GT bboxes and 1 proposals
003093.jpg: 3 GT bboxes and 4 proposals
003094.jpg: 1 GT bboxes and 2 proposals
003098.jpg: 3 GT bboxes and 1 proposals
003102.jpg: 2 GT bboxes and 5 proposals
003112.jpg: 1 GT bboxes and 4 proposals
003117.jpg: 1 GT bboxes and 1 proposals
003118.jpg: 5 GT bboxes and 8 proposals
003120.jpg: 5 GT bboxes and 2 proposals
003121.jpg: 4 GT bboxes and 4 proposals
003126.jpg: 1 GT bboxes and 0 proposals
003127.jpg: 1 GT bboxes and 1 proposals
003129.jpg: 13 GT bboxes and 22 proposals
003137.jpg: 1 GT bboxes and 3 proposals
003142.jpg: 1 GT bboxes and 12 proposals
003154.jpg: 1 GT bboxes and 5 proposals
003162.jpg: 2 GT bboxes and 1 proposals
003164.jpg: 1 GT bboxes and 3 proposals
003170.jpg: 10 GT bboxes and 12 proposals
003176.jpg: 1 GT bboxes and 2 proposals
003177.jpg: 1 GT bboxes and 1 proposals
003178.jpg: 1 GT bboxes and 8 proposals
003186.jpg: 4 GT bboxes and 9 proposals
003189.jpg: 5 GT bboxes and 19 proposals
003194.jpg: 1 GT bboxes and 2 proposals
003195.jpg: 2 GT bboxes and 3 proposals
003199.jpg: 1 GT bboxes and 1 proposals
003200.jpg: 2 GT bboxes and 4 proposals
003207.jpg: 10 GT bboxes and 13 proposals
003210.jpg: 2 GT bboxes and 4 proposals
003213.jpg: 3 GT bboxes and 1 proposals
003216.jpg: 2 GT bboxes and 1 proposals
003218.jpg: 26 GT bboxes and 27 proposals
003219.jpg: 5 GT bboxes and 2 proposals
003223.jpg: 1 GT bboxes and 13 proposals
003228.jpg: 8 GT bboxes and 15 proposals
003239.jpg: 2 GT bboxes and 9 proposals
003243.jpg: 2 GT bboxes and 11 proposals
003250.jpg: 1 GT bboxes and 1 proposals
003255.jpg: 1 GT bboxes and 1 proposals
003256.jpg: 2 GT bboxes and 5 proposals
003258.jpg: 2 GT bboxes and 8 proposals
003262.jpg: 1 GT bboxes and 4 proposals
003271.jpg: 1 GT bboxes and 2 proposals
003272.jpg: 1 GT bboxes and 1 proposals
003274.jpg: 1 GT bboxes and 4 proposals
003285.jpg: 3 GT bboxes and 10 proposals
003293.jpg: 1 GT bboxes and 1 proposals
003294.jpg: 1 GT bboxes and 1 proposals
003296.jpg: 2 GT bboxes and 4 proposals
003299.jpg: 1 GT bboxes and 3 proposals
003300.jpg: 8 GT bboxes and 12 proposals
003301.jpg: 4 GT bboxes and 4 proposals
003307.jpg: 1 GT bboxes and 2 proposals
003311.jpg: 7 GT bboxes and 13 proposals
003313.jpg: 5 GT bboxes and 9 proposals
003316.jpg: 3 GT bboxes and 5 proposals
003325.jpg: 2 GT bboxes and 1 proposals
003327.jpg: 4 GT bboxes and 6 proposals
003335.jpg: 7 GT bboxes and 6 proposals
003344.jpg: 12 GT bboxes and 18 proposals
003351.jpg: 1 GT bboxes and 2 proposals
003360.jpg: 3 GT bboxes and 4 proposals
003362.jpg: 2 GT bboxes and 3 proposals
003370.jpg: 1 GT bboxes and 2 proposals
003376.jpg: 5 GT bboxes and 15 proposals
003377.jpg: 1 GT bboxes and 5 proposals
003386.jpg: 2 GT bboxes and 6 proposals
003390.jpg: 5 GT bboxes and 7 proposals
003391.jpg: 2 GT bboxes and 12 proposals
003397.jpg: 2 GT bboxes and 16 proposals
003398.jpg: 1 GT bboxes and 0 proposals
003403.jpg: 2 GT bboxes and 7 proposals
003404.jpg: 1 GT bboxes and 3 proposals
003407.jpg: 10 GT bboxes and 7 proposals
003410.jpg: 1 GT bboxes and 4 proposals
003415.jpg: 2 GT bboxes and 2 proposals
003419.jpg: 20 GT bboxes and 25 proposals
003422.jpg: 5 GT bboxes and 17 proposals
003425.jpg: 1 GT bboxes and 3 proposals
003429.jpg: 2 GT bboxes and 3 proposals
003435.jpg: 2 GT bboxes and 18 proposals
003443.jpg: 1 GT bboxes and 2 proposals
003444.jpg: 1 GT bboxes and 1 proposals
003449.jpg: 4 GT bboxes and 3 proposals
003451.jpg: 4 GT bboxes and 19 proposals
003453.jpg: 2 GT bboxes and 10 proposals
003455.jpg: 2 GT bboxes and 1 proposals
003458.jpg: 2 GT bboxes and 2 proposals
003461.jpg: 13 GT bboxes and 2 proposals
003462.jpg: 5 GT bboxes and 11 proposals
003464.jpg: 1 GT bboxes and 2 proposals
003465.jpg: 1 GT bboxes and 1 proposals
003468.jpg: 2 GT bboxes and 5 proposals
003469.jpg: 3 GT bboxes and 5 proposals
003470.jpg: 10 GT bboxes and 18 proposals
003492.jpg: 3 GT bboxes and 4 proposals
003516.jpg: 9 GT bboxes and 30 proposals
003518.jpg: 3 GT bboxes and 6 proposals
003519.jpg: 1 GT bboxes and 1 proposals
003521.jpg: 5 GT bboxes and 12 proposals
003528.jpg: 8 GT bboxes and 8 proposals
003530.jpg: 2 GT bboxes and 3 proposals
003536.jpg: 2 GT bboxes and 5 proposals
003537.jpg: 2 GT bboxes and 2 proposals
003546.jpg: 1 GT bboxes and 2 proposals
003554.jpg: 1 GT bboxes and 1 proposals
003556.jpg: 2 GT bboxes and 4 proposals
003566.jpg: 2 GT bboxes and 19 proposals
003567.jpg: 8 GT bboxes and 14 proposals
003580.jpg: 1 GT bboxes and 4 proposals
003587.jpg: 2 GT bboxes and 1 proposals
003589.jpg: 15 GT bboxes and 22 proposals
003593.jpg: 2 GT bboxes and 2 proposals
003594.jpg: 1 GT bboxes and 3 proposals
003597.jpg: 1 GT bboxes and 1 proposals
003606.jpg: 2 GT bboxes and 3 proposals
003611.jpg: 2 GT bboxes and 4 proposals
003618.jpg: 7 GT bboxes and 9 proposals
003620.jpg: 1 GT bboxes and 1 proposals
003623.jpg: 1 GT bboxes and 1 proposals
003632.jpg: 1 GT bboxes and 2 proposals
003636.jpg: 10 GT bboxes and 23 proposals
003638.jpg: 6 GT bboxes and 5 proposals
003639.jpg: 1 GT bboxes and 1 proposals
003640.jpg: 1 GT bboxes and 3 proposals
003648.jpg: 3 GT bboxes and 1 proposals
003651.jpg: 2 GT bboxes and 2 proposals
003654.jpg: 7 GT bboxes and 2 proposals
003655.jpg: 2 GT bboxes and 3 proposals
003657.jpg: 1 GT bboxes and 2 proposals
003660.jpg: 1 GT bboxes and 0 proposals
003667.jpg: 1 GT bboxes and 1 proposals
003669.jpg: 6 GT bboxes and 5 proposals
003673.jpg: 2 GT bboxes and 2 proposals
003674.jpg: 1 GT bboxes and 1 proposals
003675.jpg: 3 GT bboxes and 1 proposals
003684.jpg: 1 GT bboxes and 5 proposals
003685.jpg: 2 GT bboxes and 4 proposals
003690.jpg: 2 GT bboxes and 18 proposals
003691.jpg: 2 GT bboxes and 11 proposals
003696.jpg: 2 GT bboxes and 3 proposals
003703.jpg: 6 GT bboxes and 7 proposals
003706.jpg: 3 GT bboxes and 4 proposals
003708.jpg: 3 GT bboxes and 6 proposals
003709.jpg: 4 GT bboxes and 6 proposals
003711.jpg: 8 GT bboxes and 11 proposals
003717.jpg: 15 GT bboxes and 23 proposals
003721.jpg: 1 GT bboxes and 1 proposals
003722.jpg: 1 GT bboxes and 3 proposals
003727.jpg: 1 GT bboxes and 5 proposals
003729.jpg: 2 GT bboxes and 3 proposals
003750.jpg: 3 GT bboxes and 3 proposals
003753.jpg: 2 GT bboxes and 1 proposals
003754.jpg: 1 GT bboxes and 12 proposals
003760.jpg: 19 GT bboxes and 13 proposals
003772.jpg: 1 GT bboxes and 3 proposals
003774.jpg: 1 GT bboxes and 2 proposals
003780.jpg: 6 GT bboxes and 9 proposals
003783.jpg: 25 GT bboxes and 19 proposals
003791.jpg: 9 GT bboxes and 13 proposals
003793.jpg: 2 GT bboxes and 1 proposals
003796.jpg: 1 GT bboxes and 10 proposals
003798.jpg: 1 GT bboxes and 5 proposals
003803.jpg: 1 GT bboxes and 9 proposals
003808.jpg: 1 GT bboxes and 1 proposals
003809.jpg: 1 GT bboxes and 5 proposals
003814.jpg: 1 GT bboxes and 9 proposals
003820.jpg: 2 GT bboxes and 10 proposals
003821.jpg: 1 GT bboxes and 2 proposals
003826.jpg: 2 GT bboxes and 3 proposals
003837.jpg: 2 GT bboxes and 5 proposals
003838.jpg: 6 GT bboxes and 9 proposals
003844.jpg: 2 GT bboxes and 12 proposals
003845.jpg: 1 GT bboxes and 3 proposals
003846.jpg: 2 GT bboxes and 9 proposals
003848.jpg: 1 GT bboxes and 1 proposals
003855.jpg: 10 GT bboxes and 19 proposals
003857.jpg: 1 GT bboxes and 1 proposals
003863.jpg: 2 GT bboxes and 14 proposals
003868.jpg: 1 GT bboxes and 0 proposals
003869.jpg: 5 GT bboxes and 4 proposals
003871.jpg: 1 GT bboxes and 0 proposals
003872.jpg: 1 GT bboxes and 1 proposals
003876.jpg: 1 GT bboxes and 1 proposals
003877.jpg: 5 GT bboxes and 18 proposals
003885.jpg: 1 GT bboxes and 0 proposals
003886.jpg: 1 GT bboxes and 4 proposals
003891.jpg: 10 GT bboxes and 22 proposals
003895.jpg: 1 GT bboxes and 1 proposals
003905.jpg: 1 GT bboxes and 6 proposals
003911.jpg: 2 GT bboxes and 7 proposals
003915.jpg: 3 GT bboxes and 3 proposals
003918.jpg: 1 GT bboxes and 1 proposals
003919.jpg: 10 GT bboxes and 4 proposals
003923.jpg: 6 GT bboxes and 14 proposals
003924.jpg: 11 GT bboxes and 7 proposals
003926.jpg: 1 GT bboxes and 1 proposals
003937.jpg: 1 GT bboxes and 1 proposals
003941.jpg: 1 GT bboxes and 4 proposals
003946.jpg: 2 GT bboxes and 4 proposals
003947.jpg: 4 GT bboxes and 12 proposals
003948.jpg: 2 GT bboxes and 3 proposals
003954.jpg: 3 GT bboxes and 10 proposals
003957.jpg: 1 GT bboxes and 2 proposals
003960.jpg: 6 GT bboxes and 14 proposals
003963.jpg: 3 GT bboxes and 5 proposals
003965.jpg: 1 GT bboxes and 7 proposals
003966.jpg: 2 GT bboxes and 7 proposals
003973.jpg: 4 GT bboxes and 15 proposals
003979.jpg: 3 GT bboxes and 4 proposals
003984.jpg: 1 GT bboxes and 1 proposals
003986.jpg: 3 GT bboxes and 3 proposals
003990.jpg: 1 GT bboxes and 1 proposals
003992.jpg: 6 GT bboxes and 8 proposals
003994.jpg: 4 GT bboxes and 23 proposals
003996.jpg: 2 GT bboxes and 5 proposals
004003.jpg: 1 GT bboxes and 3 proposals
004010.jpg: 2 GT bboxes and 3 proposals
004011.jpg: 1 GT bboxes and 4 proposals
004015.jpg: 1 GT bboxes and 1 proposals
004020.jpg: 3 GT bboxes and 4 proposals
004025.jpg: 1 GT bboxes and 5 proposals
004031.jpg: 3 GT bboxes and 2 proposals
004039.jpg: 3 GT bboxes and 6 proposals
004047.jpg: 5 GT bboxes and 6 proposals
004051.jpg: 2 GT bboxes and 2 proposals
004057.jpg: 1 GT bboxes and 6 proposals
004060.jpg: 3 GT bboxes and 3 proposals
004066.jpg: 1 GT bboxes and 3 proposals
004069.jpg: 2 GT bboxes and 2 proposals
004073.jpg: 4 GT bboxes and 6 proposals
004075.jpg: 3 GT bboxes and 4 proposals
004076.jpg: 1 GT bboxes and 1 proposals
004077.jpg: 3 GT bboxes and 4 proposals
004082.jpg: 1 GT bboxes and 8 proposals
004085.jpg: 2 GT bboxes and 13 proposals
004087.jpg: 2 GT bboxes and 1 proposals
004089.jpg: 3 GT bboxes and 7 proposals
004102.jpg: 2 GT bboxes and 3 proposals
004105.jpg: 8 GT bboxes and 29 proposals
004108.jpg: 1 GT bboxes and 1 proposals
004110.jpg: 2 GT bboxes and 14 proposals
004113.jpg: 1 GT bboxes and 1 proposals
004117.jpg: 2 GT bboxes and 5 proposals
004122.jpg: 10 GT bboxes and 13 proposals
004135.jpg: 1 GT bboxes and 2 proposals
004141.jpg: 3 GT bboxes and 1 proposals
004142.jpg: 5 GT bboxes and 7 proposals
004143.jpg: 1 GT bboxes and 1 proposals
004145.jpg: 14 GT bboxes and 17 proposals
004148.jpg: 1 GT bboxes and 1 proposals
004150.jpg: 2 GT bboxes and 3 proposals
004174.jpg: 1 GT bboxes and 9 proposals
004178.jpg: 2 GT bboxes and 4 proposals
004185.jpg: 1 GT bboxes and 1 proposals
004186.jpg: 8 GT bboxes and 10 proposals
004191.jpg: 2 GT bboxes and 8 proposals
004192.jpg: 1 GT bboxes and 8 proposals
004193.jpg: 4 GT bboxes and 7 proposals
004194.jpg: 1 GT bboxes and 6 proposals
004195.jpg: 3 GT bboxes and 7 proposals
004203.jpg: 4 GT bboxes and 11 proposals
004204.jpg: 5 GT bboxes and 21 proposals
004205.jpg: 4 GT bboxes and 8 proposals
004212.jpg: 2 GT bboxes and 6 proposals
004229.jpg: 2 GT bboxes and 7 proposals
004230.jpg: 2 GT bboxes and 3 proposals
004239.jpg: 2 GT bboxes and 2 proposals
004246.jpg: 2 GT bboxes and 15 proposals
004257.jpg: 3 GT bboxes and 18 proposals
004258.jpg: 10 GT bboxes and 14 proposals
004259.jpg: 3 GT bboxes and 12 proposals
004264.jpg: 1 GT bboxes and 1 proposals
004265.jpg: 1 GT bboxes and 3 proposals
004274.jpg: 2 GT bboxes and 5 proposals
004275.jpg: 5 GT bboxes and 7 proposals
004279.jpg: 8 GT bboxes and 23 proposals
004284.jpg: 2 GT bboxes and 1 proposals
004286.jpg: 1 GT bboxes and 1 proposals
004293.jpg: 1 GT bboxes and 5 proposals
004295.jpg: 1 GT bboxes and 4 proposals
004298.jpg: 3 GT bboxes and 8 proposals
004304.jpg: 2 GT bboxes and 7 proposals
004310.jpg: 2 GT bboxes and 1 proposals
004312.jpg: 1 GT bboxes and 2 proposals
004321.jpg: 2 GT bboxes and 3 proposals
004323.jpg: 4 GT bboxes and 9 proposals
004326.jpg: 1 GT bboxes and 1 proposals
004329.jpg: 9 GT bboxes and 16 proposals
004331.jpg: 1 GT bboxes and 15 proposals
004341.jpg: 1 GT bboxes and 1 proposals
004346.jpg: 9 GT bboxes and 16 proposals
004349.jpg: 42 GT bboxes and 22 proposals
004351.jpg: 1 GT bboxes and 0 proposals
004352.jpg: 1 GT bboxes and 1 proposals
004354.jpg: 1 GT bboxes and 1 proposals
004356.jpg: 2 GT bboxes and 6 proposals
004364.jpg: 4 GT bboxes and 13 proposals
004368.jpg: 3 GT bboxes and 3 proposals
004369.jpg: 2 GT bboxes and 1 proposals
004380.jpg: 3 GT bboxes and 4 proposals
004384.jpg: 2 GT bboxes and 2 proposals
004390.jpg: 1 GT bboxes and 1 proposals
004396.jpg: 1 GT bboxes and 4 proposals
004397.jpg: 1 GT bboxes and 7 proposals
004405.jpg: 4 GT bboxes and 16 proposals
004409.jpg: 1 GT bboxes and 1 proposals
004411.jpg: 1 GT bboxes and 2 proposals
004421.jpg: 8 GT bboxes and 24 proposals
004423.jpg: 3 GT bboxes and 3 proposals
004424.jpg: 5 GT bboxes and 10 proposals
004429.jpg: 2 GT bboxes and 2 proposals
004430.jpg: 1 GT bboxes and 3 proposals
004432.jpg: 1 GT bboxes and 1 proposals
004433.jpg: 4 GT bboxes and 2 proposals
004437.jpg: 7 GT bboxes and 2 proposals
004438.jpg: 4 GT bboxes and 9 proposals
004446.jpg: 2 GT bboxes and 4 proposals
004450.jpg: 1 GT bboxes and 1 proposals
004455.jpg: 2 GT bboxes and 9 proposals
004457.jpg: 3 GT bboxes and 9 proposals
004459.jpg: 6 GT bboxes and 4 proposals
004463.jpg: 2 GT bboxes and 7 proposals
004464.jpg: 3 GT bboxes and 5 proposals
004466.jpg: 12 GT bboxes and 15 proposals
004468.jpg: 1 GT bboxes and 1 proposals
004474.jpg: 3 GT bboxes and 4 proposals
004487.jpg: 2 GT bboxes and 3 proposals
004488.jpg: 3 GT bboxes and 5 proposals
004490.jpg: 1 GT bboxes and 1 proposals
004493.jpg: 2 GT bboxes and 20 proposals
004494.jpg: 4 GT bboxes and 20 proposals
004495.jpg: 4 GT bboxes and 12 proposals
004498.jpg: 1 GT bboxes and 3 proposals
004499.jpg: 4 GT bboxes and 4 proposals
004507.jpg: 1 GT bboxes and 1 proposals
004509.jpg: 2 GT bboxes and 3 proposals
004512.jpg: 6 GT bboxes and 4 proposals
004518.jpg: 1 GT bboxes and 24 proposals
004527.jpg: 19 GT bboxes and 28 proposals
004528.jpg: 2 GT bboxes and 3 proposals
004530.jpg: 2 GT bboxes and 8 proposals
004532.jpg: 1 GT bboxes and 3 proposals
004535.jpg: 2 GT bboxes and 2 proposals
004539.jpg: 7 GT bboxes and 13 proposals
004542.jpg: 5 GT bboxes and 19 proposals
004552.jpg: 1 GT bboxes and 7 proposals
004555.jpg: 1 GT bboxes and 3 proposals
004558.jpg: 4 GT bboxes and 2 proposals
004574.jpg: 2 GT bboxes and 3 proposals
004581.jpg: 3 GT bboxes and 4 proposals
004585.jpg: 13 GT bboxes and 21 proposals
004588.jpg: 9 GT bboxes and 9 proposals
004592.jpg: 1 GT bboxes and 0 proposals
004600.jpg: 1 GT bboxes and 2 proposals
004601.jpg: 2 GT bboxes and 8 proposals
004606.jpg: 1 GT bboxes and 0 proposals
004609.jpg: 2 GT bboxes and 3 proposals
004618.jpg: 1 GT bboxes and 0 proposals
004626.jpg: 2 GT bboxes and 3 proposals
004630.jpg: 9 GT bboxes and 18 proposals
004632.jpg: 2 GT bboxes and 1 proposals
004647.jpg: 3 GT bboxes and 4 proposals
004649.jpg: 3 GT bboxes and 1 proposals
004652.jpg: 1 GT bboxes and 2 proposals
004653.jpg: 1 GT bboxes and 2 proposals
004654.jpg: 2 GT bboxes and 1 proposals
004655.jpg: 11 GT bboxes and 35 proposals
004660.jpg: 4 GT bboxes and 1 proposals
004662.jpg: 2 GT bboxes and 4 proposals
004672.jpg: 2 GT bboxes and 2 proposals
004673.jpg: 2 GT bboxes and 9 proposals
004674.jpg: 1 GT bboxes and 3 proposals
004676.jpg: 2 GT bboxes and 8 proposals
004682.jpg: 2 GT bboxes and 14 proposals
004689.jpg: 1 GT bboxes and 1 proposals
004692.jpg: 4 GT bboxes and 8 proposals
004699.jpg: 8 GT bboxes and 5 proposals
004707.jpg: 2 GT bboxes and 4 proposals
004708.jpg: 3 GT bboxes and 1 proposals
004719.jpg: 2 GT bboxes and 4 proposals
004722.jpg: 3 GT bboxes and 5 proposals
004727.jpg: 13 GT bboxes and 12 proposals
004732.jpg: 2 GT bboxes and 12 proposals
004746.jpg: 2 GT bboxes and 2 proposals
004750.jpg: 3 GT bboxes and 10 proposals
004761.jpg: 8 GT bboxes and 19 proposals
004768.jpg: 1 GT bboxes and 2 proposals
004770.jpg: 1 GT bboxes and 3 proposals
004777.jpg: 1 GT bboxes and 3 proposals
004785.jpg: 12 GT bboxes and 10 proposals
004786.jpg: 1 GT bboxes and 8 proposals
004788.jpg: 2 GT bboxes and 7 proposals
004789.jpg: 2 GT bboxes and 2 proposals
004796.jpg: 3 GT bboxes and 9 proposals
004805.jpg: 4 GT bboxes and 11 proposals
004812.jpg: 3 GT bboxes and 3 proposals
004814.jpg: 1 GT bboxes and 2 proposals
004816.jpg: 1 GT bboxes and 1 proposals
004818.jpg: 2 GT bboxes and 5 proposals
004825.jpg: 1 GT bboxes and 19 proposals
004826.jpg: 3 GT bboxes and 16 proposals
004831.jpg: 1 GT bboxes and 2 proposals
004834.jpg: 2 GT bboxes and 3 proposals
004839.jpg: 2 GT bboxes and 11 proposals
004840.jpg: 5 GT bboxes and 17 proposals
004850.jpg: 1 GT bboxes and 6 proposals
004852.jpg: 2 GT bboxes and 1 proposals
004856.jpg: 1 GT bboxes and 1 proposals
004859.jpg: 5 GT bboxes and 14 proposals
004863.jpg: 1 GT bboxes and 1 proposals
004866.jpg: 2 GT bboxes and 1 proposals
004867.jpg: 1 GT bboxes and 1 proposals
004868.jpg: 4 GT bboxes and 4 proposals
004872.jpg: 2 GT bboxes and 6 proposals
004878.jpg: 2 GT bboxes and 6 proposals
004886.jpg: 4 GT bboxes and 4 proposals
004890.jpg: 1 GT bboxes and 1 proposals
004895.jpg: 1 GT bboxes and 1 proposals
004896.jpg: 1 GT bboxes and 2 proposals
004903.jpg: 4 GT bboxes and 10 proposals
004912.jpg: 3 GT bboxes and 5 proposals
004916.jpg: 3 GT bboxes and 12 proposals
004926.jpg: 4 GT bboxes and 17 proposals
004928.jpg: 3 GT bboxes and 7 proposals
004931.jpg: 4 GT bboxes and 7 proposals
004935.jpg: 2 GT bboxes and 2 proposals
004936.jpg: 1 GT bboxes and 0 proposals
004938.jpg: 1 GT bboxes and 1 proposals
004939.jpg: 3 GT bboxes and 1 proposals
004943.jpg: 7 GT bboxes and 19 proposals
004948.jpg: 4 GT bboxes and 13 proposals
004950.jpg: 2 GT bboxes and 2 proposals
004953.jpg: 18 GT bboxes and 20 proposals
004954.jpg: 2 GT bboxes and 3 proposals
004956.jpg: 2 GT bboxes and 2 proposals
004960.jpg: 3 GT bboxes and 10 proposals
004963.jpg: 1 GT bboxes and 1 proposals
004967.jpg: 1 GT bboxes and 9 proposals
004977.jpg: 2 GT bboxes and 1 proposals
004982.jpg: 1 GT bboxes and 1 proposals
004983.jpg: 2 GT bboxes and 4 proposals
004985.jpg: 2 GT bboxes and 2 proposals
004986.jpg: 2 GT bboxes and 0 proposals
004994.jpg: 2 GT bboxes and 7 proposals
004997.jpg: 2 GT bboxes and 1 proposals
004998.jpg: 1 GT bboxes and 1 proposals
004999.jpg: 1 GT bboxes and 3 proposals
005003.jpg: 1 GT bboxes and 10 proposals
005014.jpg: 8 GT bboxes and 9 proposals
005028.jpg: 2 GT bboxes and 5 proposals
005036.jpg: 5 GT bboxes and 5 proposals
005037.jpg: 1 GT bboxes and 2 proposals
005039.jpg: 7 GT bboxes and 33 proposals
005042.jpg: 4 GT bboxes and 10 proposals
005054.jpg: 2 GT bboxes and 2 proposals
005055.jpg: 6 GT bboxes and 17 proposals
005056.jpg: 1 GT bboxes and 2 proposals
005062.jpg: 1 GT bboxes and 2 proposals
005063.jpg: 2 GT bboxes and 11 proposals
005064.jpg: 2 GT bboxes and 8 proposals
005067.jpg: 1 GT bboxes and 7 proposals
005072.jpg: 1 GT bboxes and 1 proposals
005077.jpg: 1 GT bboxes and 1 proposals
005079.jpg: 1 GT bboxes and 1 proposals
005081.jpg: 12 GT bboxes and 33 proposals
005085.jpg: 3 GT bboxes and 13 proposals
005102.jpg: 6 GT bboxes and 13 proposals
005104.jpg: 3 GT bboxes and 18 proposals
005110.jpg: 6 GT bboxes and 11 proposals
005111.jpg: 1 GT bboxes and 2 proposals
005116.jpg: 11 GT bboxes and 11 proposals
005128.jpg: 1 GT bboxes and 12 proposals
005131.jpg: 1 GT bboxes and 1 proposals
005135.jpg: 2 GT bboxes and 10 proposals
005136.jpg: 1 GT bboxes and 2 proposals
005144.jpg: 1 GT bboxes and 2 proposals
005145.jpg: 2 GT bboxes and 12 proposals
005146.jpg: 10 GT bboxes and 33 proposals
005150.jpg: 3 GT bboxes and 12 proposals
005159.jpg: 3 GT bboxes and 6 proposals
005160.jpg: 13 GT bboxes and 29 proposals
005161.jpg: 12 GT bboxes and 17 proposals
005175.jpg: 5 GT bboxes and 17 proposals
005176.jpg: 4 GT bboxes and 5 proposals
005179.jpg: 1 GT bboxes and 3 proposals
005185.jpg: 3 GT bboxes and 4 proposals
005195.jpg: 8 GT bboxes and 9 proposals
005199.jpg: 1 GT bboxes and 1 proposals
005209.jpg: 1 GT bboxes and 1 proposals
005210.jpg: 1 GT bboxes and 7 proposals
005212.jpg: 3 GT bboxes and 4 proposals
005214.jpg: 1 GT bboxes and 3 proposals
005220.jpg: 3 GT bboxes and 13 proposals
005222.jpg: 2 GT bboxes and 3 proposals
005224.jpg: 2 GT bboxes and 12 proposals
005229.jpg: 1 GT bboxes and 1 proposals
005230.jpg: 7 GT bboxes and 13 proposals
005239.jpg: 4 GT bboxes and 17 proposals
005242.jpg: 5 GT bboxes and 36 proposals
005248.jpg: 2 GT bboxes and 10 proposals
005253.jpg: 1 GT bboxes and 1 proposals
005254.jpg: 1 GT bboxes and 5 proposals
005263.jpg: 1 GT bboxes and 0 proposals
005264.jpg: 2 GT bboxes and 1 proposals
005267.jpg: 1 GT bboxes and 1 proposals
005268.jpg: 4 GT bboxes and 6 proposals
005270.jpg: 1 GT bboxes and 1 proposals
005274.jpg: 3 GT bboxes and 5 proposals
005278.jpg: 8 GT bboxes and 19 proposals
005281.jpg: 5 GT bboxes and 8 proposals
005293.jpg: 1 GT bboxes and 3 proposals
005298.jpg: 2 GT bboxes and 12 proposals
005305.jpg: 1 GT bboxes and 4 proposals
005306.jpg: 5 GT bboxes and 7 proposals
005312.jpg: 1 GT bboxes and 1 proposals
005314.jpg: 1 GT bboxes and 2 proposals
005315.jpg: 2 GT bboxes and 2 proposals
005319.jpg: 1 GT bboxes and 1 proposals
005320.jpg: 1 GT bboxes and 9 proposals
005325.jpg: 1 GT bboxes and 13 proposals
005326.jpg: 12 GT bboxes and 11 proposals
005328.jpg: 1 GT bboxes and 0 proposals
005331.jpg: 5 GT bboxes and 7 proposals
005340.jpg: 1 GT bboxes and 3 proposals
005343.jpg: 2 GT bboxes and 9 proposals
005346.jpg: 3 GT bboxes and 9 proposals
005348.jpg: 2 GT bboxes and 2 proposals
005349.jpg: 3 GT bboxes and 7 proposals
005350.jpg: 1 GT bboxes and 2 proposals
005352.jpg: 1 GT bboxes and 3 proposals
005355.jpg: 2 GT bboxes and 1 proposals
005365.jpg: 1 GT bboxes and 1 proposals
005367.jpg: 1 GT bboxes and 3 proposals
005370.jpg: 1 GT bboxes and 2 proposals
005371.jpg: 2 GT bboxes and 5 proposals
005378.jpg: 1 GT bboxes and 15 proposals
005379.jpg: 1 GT bboxes and 1 proposals
005380.jpg: 2 GT bboxes and 4 proposals
005383.jpg: 1 GT bboxes and 1 proposals
005384.jpg: 2 GT bboxes and 8 proposals
005385.jpg: 4 GT bboxes and 7 proposals
005393.jpg: 1 GT bboxes and 1 proposals
005395.jpg: 10 GT bboxes and 13 proposals
005397.jpg: 4 GT bboxes and 9 proposals
005398.jpg: 3 GT bboxes and 5 proposals
005407.jpg: 1 GT bboxes and 0 proposals
005416.jpg: 1 GT bboxes and 2 proposals
005418.jpg: 1 GT bboxes and 1 proposals
005419.jpg: 2 GT bboxes and 3 proposals
005421.jpg: 1 GT bboxes and 6 proposals
005423.jpg: 4 GT bboxes and 10 proposals
005429.jpg: 3 GT bboxes and 3 proposals
005430.jpg: 3 GT bboxes and 4 proposals
005431.jpg: 1 GT bboxes and 10 proposals
005434.jpg: 2 GT bboxes and 1 proposals
005436.jpg: 2 GT bboxes and 6 proposals
005438.jpg: 2 GT bboxes and 3 proposals
005439.jpg: 4 GT bboxes and 3 proposals
005441.jpg: 8 GT bboxes and 27 proposals
005454.jpg: 4 GT bboxes and 5 proposals
005461.jpg: 7 GT bboxes and 17 proposals
005465.jpg: 2 GT bboxes and 8 proposals
005469.jpg: 1 GT bboxes and 2 proposals
005470.jpg: 1 GT bboxes and 2 proposals
005471.jpg: 4 GT bboxes and 6 proposals
005475.jpg: 6 GT bboxes and 7 proposals
005481.jpg: 4 GT bboxes and 0 proposals
005485.jpg: 23 GT bboxes and 14 proposals
005486.jpg: 3 GT bboxes and 2 proposals
005497.jpg: 1 GT bboxes and 1 proposals
005507.jpg: 7 GT bboxes and 18 proposals
005510.jpg: 1 GT bboxes and 2 proposals
005517.jpg: 5 GT bboxes and 31 proposals
005518.jpg: 1 GT bboxes and 1 proposals
005521.jpg: 2 GT bboxes and 5 proposals
005522.jpg: 11 GT bboxes and 23 proposals
005530.jpg: 5 GT bboxes and 1 proposals
005531.jpg: 6 GT bboxes and 19 proposals
005535.jpg: 1 GT bboxes and 1 proposals
005539.jpg: 1 GT bboxes and 1 proposals
005549.jpg: 2 GT bboxes and 3 proposals
005550.jpg: 2 GT bboxes and 5 proposals
005552.jpg: 3 GT bboxes and 16 proposals
005554.jpg: 9 GT bboxes and 20 proposals
005559.jpg: 1 GT bboxes and 1 proposals
005573.jpg: 2 GT bboxes and 9 proposals
005576.jpg: 1 GT bboxes and 14 proposals
005577.jpg: 1 GT bboxes and 1 proposals
005583.jpg: 1 GT bboxes and 4 proposals
005584.jpg: 1 GT bboxes and 4 proposals
005586.jpg: 1 GT bboxes and 2 proposals
005588.jpg: 1 GT bboxes and 6 proposals
005590.jpg: 3 GT bboxes and 5 proposals
005593.jpg: 4 GT bboxes and 1 proposals
005606.jpg: 5 GT bboxes and 7 proposals
005608.jpg: 3 GT bboxes and 5 proposals
005613.jpg: 2 GT bboxes and 3 proposals
005614.jpg: 3 GT bboxes and 11 proposals
005615.jpg: 2 GT bboxes and 5 proposals
005618.jpg: 6 GT bboxes and 8 proposals
005620.jpg: 1 GT bboxes and 2 proposals
005629.jpg: 5 GT bboxes and 21 proposals
005640.jpg: 1 GT bboxes and 5 proposals
005641.jpg: 5 GT bboxes and 1 proposals
005645.jpg: 2 GT bboxes and 1 proposals
005647.jpg: 7 GT bboxes and 20 proposals
005652.jpg: 7 GT bboxes and 14 proposals
005653.jpg: 4 GT bboxes and 8 proposals
005655.jpg: 1 GT bboxes and 3 proposals
005657.jpg: 1 GT bboxes and 7 proposals
005660.jpg: 2 GT bboxes and 2 proposals
005662.jpg: 13 GT bboxes and 16 proposals
005664.jpg: 4 GT bboxes and 6 proposals
005672.jpg: 4 GT bboxes and 8 proposals
005674.jpg: 1 GT bboxes and 0 proposals
005676.jpg: 1 GT bboxes and 12 proposals
005679.jpg: 5 GT bboxes and 10 proposals
005682.jpg: 3 GT bboxes and 4 proposals
005685.jpg: 1 GT bboxes and 1 proposals
005687.jpg: 7 GT bboxes and 23 proposals
005693.jpg: 3 GT bboxes and 5 proposals
005696.jpg: 1 GT bboxes and 1 proposals
005701.jpg: 7 GT bboxes and 15 proposals
005702.jpg: 2 GT bboxes and 3 proposals
005714.jpg: 3 GT bboxes and 8 proposals
005716.jpg: 2 GT bboxes and 2 proposals
005719.jpg: 8 GT bboxes and 36 proposals
005723.jpg: 8 GT bboxes and 24 proposals
005729.jpg: 2 GT bboxes and 6 proposals
005732.jpg: 6 GT bboxes and 14 proposals
005736.jpg: 2 GT bboxes and 7 proposals
005741.jpg: 2 GT bboxes and 5 proposals
005743.jpg: 2 GT bboxes and 3 proposals
005747.jpg: 3 GT bboxes and 6 proposals
005749.jpg: 1 GT bboxes and 2 proposals
005755.jpg: 2 GT bboxes and 2 proposals
005760.jpg: 2 GT bboxes and 9 proposals
005761.jpg: 1 GT bboxes and 1 proposals
005762.jpg: 2 GT bboxes and 11 proposals
005768.jpg: 4 GT bboxes and 8 proposals
005773.jpg: 7 GT bboxes and 13 proposals
005779.jpg: 2 GT bboxes and 3 proposals
005781.jpg: 1 GT bboxes and 3 proposals
005788.jpg: 2 GT bboxes and 1 proposals
005790.jpg: 2 GT bboxes and 2 proposals
005791.jpg: 2 GT bboxes and 11 proposals
005794.jpg: 9 GT bboxes and 22 proposals
005799.jpg: 4 GT bboxes and 15 proposals
005811.jpg: 4 GT bboxes and 4 proposals
005812.jpg: 2 GT bboxes and 6 proposals
005815.jpg: 2 GT bboxes and 2 proposals
005818.jpg: 2 GT bboxes and 10 proposals
005819.jpg: 2 GT bboxes and 2 proposals
005825.jpg: 1 GT bboxes and 3 proposals
005828.jpg: 1 GT bboxes and 3 proposals
005829.jpg: 3 GT bboxes and 11 proposals
005830.jpg: 1 GT bboxes and 2 proposals
005839.jpg: 2 GT bboxes and 3 proposals
005841.jpg: 1 GT bboxes and 6 proposals
005845.jpg: 2 GT bboxes and 6 proposals
005852.jpg: 3 GT bboxes and 1 proposals
005853.jpg: 1 GT bboxes and 2 proposals
005854.jpg: 3 GT bboxes and 5 proposals
005856.jpg: 3 GT bboxes and 6 proposals
005863.jpg: 13 GT bboxes and 18 proposals
005868.jpg: 1 GT bboxes and 1 proposals
005874.jpg: 2 GT bboxes and 11 proposals
005875.jpg: 1 GT bboxes and 3 proposals
005877.jpg: 2 GT bboxes and 8 proposals
005878.jpg: 1 GT bboxes and 4 proposals
005879.jpg: 1 GT bboxes and 1 proposals
005894.jpg: 4 GT bboxes and 8 proposals
005897.jpg: 3 GT bboxes and 15 proposals
005906.jpg: 3 GT bboxes and 8 proposals
005912.jpg: 1 GT bboxes and 1 proposals
005914.jpg: 3 GT bboxes and 7 proposals
005917.jpg: 3 GT bboxes and 4 proposals
005919.jpg: 20 GT bboxes and 31 proposals
005928.jpg: 7 GT bboxes and 26 proposals
005940.jpg: 6 GT bboxes and 15 proposals
005952.jpg: 2 GT bboxes and 3 proposals
005954.jpg: 1 GT bboxes and 1 proposals
005956.jpg: 4 GT bboxes and 4 proposals
005963.jpg: 4 GT bboxes and 21 proposals
005968.jpg: 1 GT bboxes and 3 proposals
005970.jpg: 1 GT bboxes and 1 proposals
005975.jpg: 2 GT bboxes and 1 proposals
005979.jpg: 3 GT bboxes and 9 proposals
005981.jpg: 2 GT bboxes and 5 proposals
005985.jpg: 2 GT bboxes and 9 proposals
005988.jpg: 6 GT bboxes and 18 proposals
005989.jpg: 2 GT bboxes and 7 proposals
005991.jpg: 2 GT bboxes and 7 proposals
005995.jpg: 2 GT bboxes and 1 proposals
005996.jpg: 1 GT bboxes and 1 proposals
005998.jpg: 1 GT bboxes and 11 proposals
006000.jpg: 2 GT bboxes and 5 proposals
006001.jpg: 1 GT bboxes and 2 proposals
006005.jpg: 3 GT bboxes and 1 proposals
006012.jpg: 2 GT bboxes and 3 proposals
006018.jpg: 10 GT bboxes and 16 proposals
006026.jpg: 2 GT bboxes and 2 proposals
006027.jpg: 1 GT bboxes and 13 proposals
006028.jpg: 3 GT bboxes and 17 proposals
006029.jpg: 11 GT bboxes and 22 proposals
006035.jpg: 6 GT bboxes and 11 proposals
006041.jpg: 4 GT bboxes and 7 proposals
006042.jpg: 1 GT bboxes and 2 proposals
006045.jpg: 2 GT bboxes and 10 proposals
006046.jpg: 3 GT bboxes and 19 proposals
006055.jpg: 5 GT bboxes and 24 proposals
006058.jpg: 1 GT bboxes and 1 proposals
006062.jpg: 3 GT bboxes and 6 proposals
006069.jpg: 2 GT bboxes and 1 proposals
006071.jpg: 10 GT bboxes and 19 proposals
006084.jpg: 1 GT bboxes and 1 proposals
006089.jpg: 1 GT bboxes and 1 proposals
006097.jpg: 1 GT bboxes and 1 proposals
006098.jpg: 3 GT bboxes and 5 proposals
006107.jpg: 1 GT bboxes and 1 proposals
006108.jpg: 1 GT bboxes and 1 proposals
006111.jpg: 1 GT bboxes and 1 proposals
006117.jpg: 1 GT bboxes and 5 proposals
006120.jpg: 2 GT bboxes and 6 proposals
006124.jpg: 1 GT bboxes and 1 proposals
006125.jpg: 2 GT bboxes and 1 proposals
006129.jpg: 1 GT bboxes and 1 proposals
006133.jpg: 17 GT bboxes and 10 proposals
006136.jpg: 1 GT bboxes and 6 proposals
006139.jpg: 2 GT bboxes and 4 proposals
006146.jpg: 1 GT bboxes and 8 proposals
006148.jpg: 2 GT bboxes and 7 proposals
006150.jpg: 4 GT bboxes and 18 proposals
006151.jpg: 5 GT bboxes and 15 proposals
006153.jpg: 1 GT bboxes and 5 proposals
006159.jpg: 1 GT bboxes and 13 proposals
006161.jpg: 11 GT bboxes and 39 proposals
006163.jpg: 1 GT bboxes and 1 proposals
006184.jpg: 1 GT bboxes and 9 proposals
006185.jpg: 5 GT bboxes and 15 proposals
006188.jpg: 4 GT bboxes and 22 proposals
006190.jpg: 1 GT bboxes and 5 proposals
006198.jpg: 10 GT bboxes and 26 proposals
006201.jpg: 2 GT bboxes and 10 proposals
006202.jpg: 3 GT bboxes and 14 proposals
006203.jpg: 2 GT bboxes and 0 proposals
006206.jpg: 3 GT bboxes and 15 proposals
006209.jpg: 2 GT bboxes and 8 proposals
006212.jpg: 1 GT bboxes and 1 proposals
006214.jpg: 1 GT bboxes and 7 proposals
006215.jpg: 3 GT bboxes and 1 proposals
006216.jpg: 4 GT bboxes and 1 proposals
006218.jpg: 2 GT bboxes and 9 proposals
006219.jpg: 1 GT bboxes and 2 proposals
006220.jpg: 8 GT bboxes and 21 proposals
006222.jpg: 2 GT bboxes and 7 proposals
006233.jpg: 1 GT bboxes and 1 proposals
006234.jpg: 1 GT bboxes and 2 proposals
006235.jpg: 11 GT bboxes and 6 proposals
006240.jpg: 1 GT bboxes and 2 proposals
006241.jpg: 7 GT bboxes and 28 proposals
006249.jpg: 1 GT bboxes and 4 proposals
006252.jpg: 1 GT bboxes and 1 proposals
006254.jpg: 1 GT bboxes and 1 proposals
006258.jpg: 1 GT bboxes and 2 proposals
006259.jpg: 6 GT bboxes and 36 proposals
006260.jpg: 1 GT bboxes and 2 proposals
006269.jpg: 1 GT bboxes and 1 proposals
006276.jpg: 2 GT bboxes and 3 proposals
006277.jpg: 1 GT bboxes and 1 proposals
006281.jpg: 2 GT bboxes and 6 proposals
006282.jpg: 1 GT bboxes and 5 proposals
006284.jpg: 1 GT bboxes and 1 proposals
006286.jpg: 20 GT bboxes and 20 proposals
006295.jpg: 3 GT bboxes and 8 proposals
006296.jpg: 3 GT bboxes and 8 proposals
006300.jpg: 6 GT bboxes and 13 proposals
006301.jpg: 1 GT bboxes and 2 proposals
006306.jpg: 1 GT bboxes and 1 proposals
006309.jpg: 1 GT bboxes and 2 proposals
006314.jpg: 1 GT bboxes and 2 proposals
006318.jpg: 1 GT bboxes and 2 proposals
006319.jpg: 2 GT bboxes and 8 proposals
006321.jpg: 2 GT bboxes and 1 proposals
006323.jpg: 2 GT bboxes and 23 proposals
006325.jpg: 1 GT bboxes and 4 proposals
006330.jpg: 8 GT bboxes and 15 proposals
006335.jpg: 1 GT bboxes and 7 proposals
006337.jpg: 1 GT bboxes and 1 proposals
006338.jpg: 1 GT bboxes and 3 proposals
006339.jpg: 8 GT bboxes and 4 proposals
006346.jpg: 11 GT bboxes and 24 proposals
006348.jpg: 2 GT bboxes and 7 proposals
006350.jpg: 1 GT bboxes and 1 proposals
006351.jpg: 3 GT bboxes and 3 proposals
006355.jpg: 3 GT bboxes and 4 proposals
006357.jpg: 3 GT bboxes and 6 proposals
006377.jpg: 1 GT bboxes and 2 proposals
006385.jpg: 1 GT bboxes and 1 proposals
006387.jpg: 2 GT bboxes and 4 proposals
006391.jpg: 2 GT bboxes and 10 proposals
006392.jpg: 2 GT bboxes and 12 proposals
006396.jpg: 9 GT bboxes and 13 proposals
006398.jpg: 16 GT bboxes and 32 proposals
006404.jpg: 1 GT bboxes and 4 proposals
006409.jpg: 4 GT bboxes and 12 proposals
006421.jpg: 3 GT bboxes and 11 proposals
006424.jpg: 2 GT bboxes and 4 proposals
006425.jpg: 1 GT bboxes and 2 proposals
006428.jpg: 3 GT bboxes and 4 proposals
006430.jpg: 1 GT bboxes and 8 proposals
006437.jpg: 1 GT bboxes and 10 proposals
006440.jpg: 2 GT bboxes and 9 proposals
006443.jpg: 1 GT bboxes and 4 proposals
006444.jpg: 2 GT bboxes and 7 proposals
006445.jpg: 2 GT bboxes and 5 proposals
006449.jpg: 1 GT bboxes and 0 proposals
006450.jpg: 3 GT bboxes and 7 proposals
006456.jpg: 1 GT bboxes and 1 proposals
006463.jpg: 2 GT bboxes and 2 proposals
006465.jpg: 8 GT bboxes and 15 proposals
006468.jpg: 1 GT bboxes and 1 proposals
006473.jpg: 3 GT bboxes and 5 proposals
006480.jpg: 1 GT bboxes and 0 proposals
006484.jpg: 1 GT bboxes and 6 proposals
006488.jpg: 2 GT bboxes and 2 proposals
006492.jpg: 3 GT bboxes and 1 proposals
006497.jpg: 8 GT bboxes and 8 proposals
006507.jpg: 1 GT bboxes and 4 proposals
006509.jpg: 3 GT bboxes and 4 proposals
006512.jpg: 1 GT bboxes and 1 proposals
006519.jpg: 6 GT bboxes and 7 proposals
006520.jpg: 1 GT bboxes and 1 proposals
006529.jpg: 2 GT bboxes and 2 proposals
006530.jpg: 6 GT bboxes and 19 proposals
006532.jpg: 2 GT bboxes and 3 proposals
006534.jpg: 1 GT bboxes and 1 proposals
006538.jpg: 1 GT bboxes and 1 proposals
006542.jpg: 16 GT bboxes and 9 proposals
006543.jpg: 1 GT bboxes and 7 proposals
006553.jpg: 1 GT bboxes and 2 proposals
006562.jpg: 5 GT bboxes and 8 proposals
006565.jpg: 1 GT bboxes and 1 proposals
006570.jpg: 2 GT bboxes and 8 proposals
006572.jpg: 5 GT bboxes and 17 proposals
006575.jpg: 1 GT bboxes and 9 proposals
006576.jpg: 5 GT bboxes and 9 proposals
006578.jpg: 3 GT bboxes and 9 proposals
006583.jpg: 3 GT bboxes and 14 proposals
006584.jpg: 10 GT bboxes and 30 proposals
006585.jpg: 2 GT bboxes and 5 proposals
006587.jpg: 1 GT bboxes and 2 proposals
006588.jpg: 7 GT bboxes and 4 proposals
006593.jpg: 1 GT bboxes and 1 proposals
006599.jpg: 4 GT bboxes and 9 proposals
006603.jpg: 1 GT bboxes and 4 proposals
006606.jpg: 2 GT bboxes and 1 proposals
006611.jpg: 2 GT bboxes and 1 proposals
006617.jpg: 2 GT bboxes and 4 proposals
006618.jpg: 2 GT bboxes and 9 proposals
006619.jpg: 1 GT bboxes and 3 proposals
006621.jpg: 2 GT bboxes and 6 proposals
006625.jpg: 6 GT bboxes and 12 proposals
006628.jpg: 11 GT bboxes and 22 proposals
006631.jpg: 2 GT bboxes and 2 proposals
006632.jpg: 2 GT bboxes and 6 proposals
006643.jpg: 1 GT bboxes and 1 proposals
006645.jpg: 2 GT bboxes and 2 proposals
006647.jpg: 4 GT bboxes and 7 proposals
006657.jpg: 1 GT bboxes and 3 proposals
006661.jpg: 12 GT bboxes and 9 proposals
006664.jpg: 2 GT bboxes and 4 proposals
006666.jpg: 2 GT bboxes and 5 proposals
006667.jpg: 2 GT bboxes and 2 proposals
006668.jpg: 3 GT bboxes and 8 proposals
006670.jpg: 3 GT bboxes and 7 proposals
006671.jpg: 2 GT bboxes and 10 proposals
006673.jpg: 12 GT bboxes and 21 proposals
006677.jpg: 3 GT bboxes and 3 proposals
006678.jpg: 1 GT bboxes and 6 proposals
006679.jpg: 3 GT bboxes and 14 proposals
006681.jpg: 4 GT bboxes and 0 proposals
006682.jpg: 3 GT bboxes and 4 proposals
006687.jpg: 1 GT bboxes and 11 proposals
006690.jpg: 4 GT bboxes and 15 proposals
006696.jpg: 7 GT bboxes and 26 proposals
006699.jpg: 2 GT bboxes and 5 proposals
006702.jpg: 2 GT bboxes and 1 proposals
006709.jpg: 3 GT bboxes and 11 proposals
006718.jpg: 2 GT bboxes and 6 proposals
006719.jpg: 5 GT bboxes and 13 proposals
006722.jpg: 6 GT bboxes and 11 proposals
006725.jpg: 1 GT bboxes and 1 proposals
006730.jpg: 1 GT bboxes and 1 proposals
006739.jpg: 3 GT bboxes and 3 proposals
006747.jpg: 1 GT bboxes and 7 proposals
006751.jpg: 2 GT bboxes and 4 proposals
006759.jpg: 1 GT bboxes and 1 proposals
006760.jpg: 3 GT bboxes and 1 proposals
006761.jpg: 1 GT bboxes and 3 proposals
006762.jpg: 3 GT bboxes and 8 proposals
006765.jpg: 5 GT bboxes and 16 proposals
006768.jpg: 4 GT bboxes and 11 proposals
006769.jpg: 2 GT bboxes and 2 proposals
006772.jpg: 2 GT bboxes and 4 proposals
006783.jpg: 6 GT bboxes and 9 proposals
006786.jpg: 2 GT bboxes and 6 proposals
006789.jpg: 3 GT bboxes and 6 proposals
006797.jpg: 2 GT bboxes and 2 proposals
006799.jpg: 1 GT bboxes and 2 proposals
006800.jpg: 6 GT bboxes and 13 proposals
006802.jpg: 3 GT bboxes and 3 proposals
006803.jpg: 3 GT bboxes and 5 proposals
006808.jpg: 1 GT bboxes and 4 proposals
006813.jpg: 2 GT bboxes and 2 proposals
006814.jpg: 1 GT bboxes and 6 proposals
006819.jpg: 5 GT bboxes and 13 proposals
006821.jpg: 6 GT bboxes and 16 proposals
006827.jpg: 2 GT bboxes and 7 proposals
006828.jpg: 1 GT bboxes and 5 proposals
006829.jpg: 1 GT bboxes and 1 proposals
006835.jpg: 2 GT bboxes and 4 proposals
006838.jpg: 1 GT bboxes and 1 proposals
006841.jpg: 7 GT bboxes and 19 proposals
006842.jpg: 2 GT bboxes and 9 proposals
006850.jpg: 2 GT bboxes and 5 proposals
006855.jpg: 3 GT bboxes and 5 proposals
006859.jpg: 2 GT bboxes and 3 proposals
006860.jpg: 1 GT bboxes and 10 proposals
006862.jpg: 7 GT bboxes and 10 proposals
006865.jpg: 1 GT bboxes and 1 proposals
006867.jpg: 1 GT bboxes and 0 proposals
006876.jpg: 3 GT bboxes and 4 proposals
006878.jpg: 2 GT bboxes and 2 proposals
006880.jpg: 6 GT bboxes and 12 proposals
006884.jpg: 1 GT bboxes and 1 proposals
006886.jpg: 2 GT bboxes and 9 proposals
006892.jpg: 6 GT bboxes and 15 proposals
006903.jpg: 4 GT bboxes and 6 proposals
006908.jpg: 13 GT bboxes and 23 proposals
006918.jpg: 2 GT bboxes and 4 proposals
006922.jpg: 1 GT bboxes and 6 proposals
006924.jpg: 1 GT bboxes and 1 proposals
006932.jpg: 2 GT bboxes and 4 proposals
006933.jpg: 2 GT bboxes and 3 proposals
006934.jpg: 6 GT bboxes and 8 proposals
006935.jpg: 1 GT bboxes and 1 proposals
006940.jpg: 1 GT bboxes and 1 proposals
006944.jpg: 6 GT bboxes and 15 proposals
006945.jpg: 6 GT bboxes and 10 proposals
006949.jpg: 1 GT bboxes and 1 proposals
006952.jpg: 1 GT bboxes and 0 proposals
006953.jpg: 1 GT bboxes and 7 proposals
006956.jpg: 4 GT bboxes and 24 proposals
006962.jpg: 1 GT bboxes and 10 proposals
006963.jpg: 5 GT bboxes and 10 proposals
006965.jpg: 6 GT bboxes and 2 proposals
006966.jpg: 1 GT bboxes and 3 proposals
006972.jpg: 4 GT bboxes and 22 proposals
006981.jpg: 1 GT bboxes and 13 proposals
006987.jpg: 3 GT bboxes and 10 proposals
006988.jpg: 2 GT bboxes and 3 proposals
006989.jpg: 2 GT bboxes and 2 proposals
006990.jpg: 2 GT bboxes and 6 proposals
006994.jpg: 1 GT bboxes and 3 proposals
006995.jpg: 1 GT bboxes and 10 proposals
007004.jpg: 6 GT bboxes and 13 proposals
007008.jpg: 2 GT bboxes and 2 proposals
007009.jpg: 1 GT bboxes and 1 proposals
007020.jpg: 1 GT bboxes and 4 proposals
007021.jpg: 5 GT bboxes and 17 proposals
007022.jpg: 1 GT bboxes and 4 proposals
007031.jpg: 2 GT bboxes and 3 proposals
007035.jpg: 3 GT bboxes and 9 proposals
007038.jpg: 1 GT bboxes and 1 proposals
007042.jpg: 6 GT bboxes and 10 proposals
007046.jpg: 2 GT bboxes and 5 proposals
007048.jpg: 7 GT bboxes and 0 proposals
007049.jpg: 3 GT bboxes and 6 proposals
007052.jpg: 3 GT bboxes and 9 proposals
007054.jpg: 1 GT bboxes and 5 proposals
007056.jpg: 1 GT bboxes and 0 proposals
007058.jpg: 1 GT bboxes and 4 proposals
007059.jpg: 10 GT bboxes and 13 proposals
007065.jpg: 1 GT bboxes and 1 proposals
007068.jpg: 8 GT bboxes and 1 proposals
007070.jpg: 1 GT bboxes and 1 proposals
007071.jpg: 1 GT bboxes and 1 proposals
007074.jpg: 3 GT bboxes and 9 proposals
007077.jpg: 4 GT bboxes and 1 proposals
007084.jpg: 1 GT bboxes and 4 proposals
007086.jpg: 1 GT bboxes and 4 proposals
007097.jpg: 1 GT bboxes and 1 proposals
007100.jpg: 2 GT bboxes and 6 proposals
007101.jpg: 1 GT bboxes and 1 proposals
007104.jpg: 1 GT bboxes and 1 proposals
007109.jpg: 2 GT bboxes and 3 proposals
007114.jpg: 3 GT bboxes and 4 proposals
007117.jpg: 9 GT bboxes and 7 proposals
007122.jpg: 2 GT bboxes and 1 proposals
007123.jpg: 1 GT bboxes and 2 proposals
007132.jpg: 2 GT bboxes and 2 proposals
007139.jpg: 2 GT bboxes and 16 proposals
007140.jpg: 2 GT bboxes and 9 proposals
007141.jpg: 3 GT bboxes and 7 proposals
007144.jpg: 1 GT bboxes and 13 proposals
007146.jpg: 1 GT bboxes and 1 proposals
007147.jpg: 2 GT bboxes and 9 proposals
007148.jpg: 2 GT bboxes and 3 proposals
007149.jpg: 1 GT bboxes and 1 proposals
007153.jpg: 3 GT bboxes and 8 proposals
007162.jpg: 1 GT bboxes and 5 proposals
007165.jpg: 2 GT bboxes and 4 proposals
007167.jpg: 4 GT bboxes and 2 proposals
007172.jpg: 8 GT bboxes and 12 proposals
007174.jpg: 1 GT bboxes and 10 proposals
007187.jpg: 4 GT bboxes and 9 proposals
007189.jpg: 2 GT bboxes and 1 proposals
007191.jpg: 12 GT bboxes and 22 proposals
007200.jpg: 2 GT bboxes and 6 proposals
007204.jpg: 2 GT bboxes and 1 proposals
007208.jpg: 3 GT bboxes and 3 proposals
007210.jpg: 1 GT bboxes and 5 proposals
007211.jpg: 1 GT bboxes and 4 proposals
007212.jpg: 3 GT bboxes and 1 proposals
007215.jpg: 1 GT bboxes and 1 proposals
007216.jpg: 2 GT bboxes and 3 proposals
007217.jpg: 11 GT bboxes and 27 proposals
007224.jpg: 1 GT bboxes and 2 proposals
007227.jpg: 2 GT bboxes and 4 proposals
007230.jpg: 2 GT bboxes and 6 proposals
007236.jpg: 6 GT bboxes and 6 proposals
007244.jpg: 2 GT bboxes and 6 proposals
007245.jpg: 2 GT bboxes and 3 proposals
007247.jpg: 2 GT bboxes and 4 proposals
007249.jpg: 1 GT bboxes and 1 proposals
007258.jpg: 1 GT bboxes and 0 proposals
007259.jpg: 1 GT bboxes and 1 proposals
007260.jpg: 2 GT bboxes and 3 proposals
007266.jpg: 5 GT bboxes and 4 proposals
007270.jpg: 3 GT bboxes and 10 proposals
007274.jpg: 1 GT bboxes and 2 proposals
007275.jpg: 1 GT bboxes and 1 proposals
007276.jpg: 2 GT bboxes and 1 proposals
007280.jpg: 2 GT bboxes and 5 proposals
007283.jpg: 3 GT bboxes and 9 proposals
007284.jpg: 2 GT bboxes and 2 proposals
007292.jpg: 2 GT bboxes and 10 proposals
007294.jpg: 1 GT bboxes and 6 proposals
007296.jpg: 6 GT bboxes and 5 proposals
007297.jpg: 1 GT bboxes and 1 proposals
007299.jpg: 3 GT bboxes and 5 proposals
007300.jpg: 5 GT bboxes and 14 proposals
007302.jpg: 2 GT bboxes and 6 proposals
007311.jpg: 3 GT bboxes and 11 proposals
007314.jpg: 9 GT bboxes and 14 proposals
007318.jpg: 1 GT bboxes and 3 proposals
007329.jpg: 1 GT bboxes and 1 proposals
007330.jpg: 1 GT bboxes and 1 proposals
007343.jpg: 1 GT bboxes and 2 proposals
007344.jpg: 5 GT bboxes and 3 proposals
007346.jpg: 7 GT bboxes and 11 proposals
007350.jpg: 8 GT bboxes and 21 proposals
007356.jpg: 2 GT bboxes and 3 proposals
007359.jpg: 2 GT bboxes and 4 proposals
007363.jpg: 1 GT bboxes and 2 proposals
007372.jpg: 1 GT bboxes and 10 proposals
007374.jpg: 2 GT bboxes and 7 proposals
007376.jpg: 3 GT bboxes and 21 proposals
007383.jpg: 3 GT bboxes and 9 proposals
007388.jpg: 1 GT bboxes and 2 proposals
007390.jpg: 5 GT bboxes and 15 proposals
007408.jpg: 3 GT bboxes and 1 proposals
007414.jpg: 2 GT bboxes and 18 proposals
007416.jpg: 2 GT bboxes and 3 proposals
007422.jpg: 1 GT bboxes and 1 proposals
007424.jpg: 1 GT bboxes and 1 proposals
007427.jpg: 4 GT bboxes and 13 proposals
007432.jpg: 3 GT bboxes and 21 proposals
007433.jpg: 4 GT bboxes and 2 proposals
007435.jpg: 5 GT bboxes and 20 proposals
007436.jpg: 2 GT bboxes and 6 proposals
007438.jpg: 1 GT bboxes and 2 proposals
007439.jpg: 1 GT bboxes and 2 proposals
007443.jpg: 5 GT bboxes and 18 proposals
007445.jpg: 2 GT bboxes and 5 proposals
007448.jpg: 2 GT bboxes and 7 proposals
007449.jpg: 3 GT bboxes and 4 proposals
007451.jpg: 4 GT bboxes and 13 proposals
007457.jpg: 2 GT bboxes and 3 proposals
007460.jpg: 1 GT bboxes and 1 proposals
007461.jpg: 10 GT bboxes and 19 proposals
007465.jpg: 1 GT bboxes and 1 proposals
007470.jpg: 1 GT bboxes and 1 proposals
007475.jpg: 2 GT bboxes and 4 proposals
007480.jpg: 2 GT bboxes and 10 proposals
007482.jpg: 4 GT bboxes and 16 proposals
007484.jpg: 4 GT bboxes and 9 proposals
007486.jpg: 1 GT bboxes and 7 proposals
007489.jpg: 1 GT bboxes and 1 proposals
007498.jpg: 2 GT bboxes and 3 proposals
007506.jpg: 1 GT bboxes and 2 proposals
007511.jpg: 8 GT bboxes and 29 proposals
007517.jpg: 1 GT bboxes and 2 proposals
007523.jpg: 1 GT bboxes and 2 proposals
007525.jpg: 1 GT bboxes and 6 proposals
007527.jpg: 12 GT bboxes and 11 proposals
007528.jpg: 8 GT bboxes and 22 proposals
007533.jpg: 2 GT bboxes and 3 proposals
007537.jpg: 2 GT bboxes and 5 proposals
007543.jpg: 5 GT bboxes and 13 proposals
007546.jpg: 1 GT bboxes and 7 proposals
007547.jpg: 2 GT bboxes and 7 proposals
007551.jpg: 1 GT bboxes and 4 proposals
007555.jpg: 1 GT bboxes and 0 proposals
007559.jpg: 2 GT bboxes and 11 proposals
007563.jpg: 2 GT bboxes and 5 proposals
007568.jpg: 1 GT bboxes and 1 proposals
007571.jpg: 4 GT bboxes and 10 proposals
007576.jpg: 2 GT bboxes and 3 proposals
007579.jpg: 5 GT bboxes and 21 proposals
007585.jpg: 2 GT bboxes and 1 proposals
007592.jpg: 3 GT bboxes and 15 proposals
007603.jpg: 1 GT bboxes and 6 proposals
007605.jpg: 5 GT bboxes and 4 proposals
007612.jpg: 1 GT bboxes and 1 proposals
007614.jpg: 1 GT bboxes and 2 proposals
007615.jpg: 2 GT bboxes and 1 proposals
007618.jpg: 1 GT bboxes and 3 proposals
007622.jpg: 1 GT bboxes and 1 proposals
007624.jpg: 9 GT bboxes and 11 proposals
007626.jpg: 1 GT bboxes and 1 proposals
007639.jpg: 2 GT bboxes and 1 proposals
007640.jpg: 1 GT bboxes and 1 proposals
007642.jpg: 1 GT bboxes and 0 proposals
007647.jpg: 3 GT bboxes and 3 proposals
007649.jpg: 3 GT bboxes and 3 proposals
007650.jpg: 4 GT bboxes and 14 proposals
007656.jpg: 2 GT bboxes and 2 proposals
007657.jpg: 1 GT bboxes and 1 proposals
007662.jpg: 1 GT bboxes and 8 proposals
007664.jpg: 6 GT bboxes and 16 proposals
007666.jpg: 1 GT bboxes and 1 proposals
007668.jpg: 1 GT bboxes and 1 proposals
007670.jpg: 2 GT bboxes and 4 proposals
007671.jpg: 1 GT bboxes and 1 proposals
007672.jpg: 1 GT bboxes and 5 proposals
007673.jpg: 3 GT bboxes and 4 proposals
007675.jpg: 2 GT bboxes and 3 proposals
007677.jpg: 1 GT bboxes and 1 proposals
007678.jpg: 1 GT bboxes and 6 proposals
007679.jpg: 1 GT bboxes and 3 proposals
007680.jpg: 5 GT bboxes and 3 proposals
007682.jpg: 1 GT bboxes and 1 proposals
007687.jpg: 2 GT bboxes and 3 proposals
007688.jpg: 1 GT bboxes and 2 proposals
007691.jpg: 1 GT bboxes and 3 proposals
007694.jpg: 3 GT bboxes and 4 proposals
007702.jpg: 1 GT bboxes and 10 proposals
007705.jpg: 2 GT bboxes and 4 proposals
007709.jpg: 7 GT bboxes and 2 proposals
007712.jpg: 2 GT bboxes and 10 proposals
007715.jpg: 1 GT bboxes and 1 proposals
007720.jpg: 4 GT bboxes and 4 proposals
007723.jpg: 2 GT bboxes and 5 proposals
007724.jpg: 1 GT bboxes and 2 proposals
007727.jpg: 4 GT bboxes and 24 proposals
007732.jpg: 3 GT bboxes and 3 proposals
007742.jpg: 1 GT bboxes and 1 proposals
007743.jpg: 1 GT bboxes and 6 proposals
007745.jpg: 2 GT bboxes and 2 proposals
007746.jpg: 6 GT bboxes and 4 proposals
007754.jpg: 5 GT bboxes and 12 proposals
007758.jpg: 1 GT bboxes and 2 proposals
007760.jpg: 2 GT bboxes and 3 proposals
007763.jpg: 7 GT bboxes and 20 proposals
007765.jpg: 1 GT bboxes and 2 proposals
007768.jpg: 2 GT bboxes and 2 proposals
007772.jpg: 1 GT bboxes and 2 proposals
007773.jpg: 1 GT bboxes and 1 proposals
007776.jpg: 5 GT bboxes and 1 proposals
007779.jpg: 3 GT bboxes and 8 proposals
007786.jpg: 4 GT bboxes and 12 proposals
007793.jpg: 5 GT bboxes and 11 proposals
007798.jpg: 1 GT bboxes and 1 proposals
007799.jpg: 16 GT bboxes and 30 proposals
007812.jpg: 2 GT bboxes and 20 proposals
007813.jpg: 3 GT bboxes and 12 proposals
007815.jpg: 3 GT bboxes and 1 proposals
007824.jpg: 1 GT bboxes and 1 proposals
007826.jpg: 7 GT bboxes and 29 proposals
007833.jpg: 2 GT bboxes and 4 proposals
007834.jpg: 1 GT bboxes and 1 proposals
007841.jpg: 3 GT bboxes and 3 proposals
007843.jpg: 1 GT bboxes and 5 proposals
007845.jpg: 2 GT bboxes and 3 proposals
007855.jpg: 2 GT bboxes and 15 proposals
007856.jpg: 12 GT bboxes and 10 proposals
007857.jpg: 1 GT bboxes and 4 proposals
007865.jpg: 5 GT bboxes and 2 proposals
007868.jpg: 1 GT bboxes and 1 proposals
007869.jpg: 1 GT bboxes and 2 proposals
007873.jpg: 1 GT bboxes and 5 proposals
007886.jpg: 1 GT bboxes and 1 proposals
007889.jpg: 1 GT bboxes and 3 proposals
007890.jpg: 2 GT bboxes and 8 proposals
007897.jpg: 12 GT bboxes and 1 proposals
007899.jpg: 1 GT bboxes and 9 proposals
007902.jpg: 4 GT bboxes and 5 proposals
007909.jpg: 6 GT bboxes and 7 proposals
007916.jpg: 1 GT bboxes and 4 proposals
007919.jpg: 2 GT bboxes and 4 proposals
007920.jpg: 6 GT bboxes and 5 proposals
007921.jpg: 1 GT bboxes and 6 proposals
007924.jpg: 2 GT bboxes and 13 proposals
007928.jpg: 11 GT bboxes and 17 proposals
007931.jpg: 6 GT bboxes and 6 proposals
007933.jpg: 1 GT bboxes and 6 proposals
007935.jpg: 2 GT bboxes and 1 proposals
007943.jpg: 3 GT bboxes and 21 proposals
007946.jpg: 2 GT bboxes and 8 proposals
007947.jpg: 1 GT bboxes and 5 proposals
007950.jpg: 5 GT bboxes and 10 proposals
007954.jpg: 1 GT bboxes and 1 proposals
007956.jpg: 3 GT bboxes and 32 proposals
007958.jpg: 2 GT bboxes and 1 proposals
007970.jpg: 3 GT bboxes and 10 proposals
007971.jpg: 2 GT bboxes and 3 proposals
007979.jpg: 3 GT bboxes and 5 proposals
007984.jpg: 9 GT bboxes and 27 proposals
007987.jpg: 3 GT bboxes and 9 proposals
007997.jpg: 2 GT bboxes and 2 proposals
007998.jpg: 2 GT bboxes and 11 proposals
007999.jpg: 4 GT bboxes and 11 proposals
008002.jpg: 6 GT bboxes and 28 proposals
008009.jpg: 1 GT bboxes and 1 proposals
008023.jpg: 5 GT bboxes and 7 proposals
008024.jpg: 2 GT bboxes and 6 proposals
008029.jpg: 1 GT bboxes and 3 proposals
008031.jpg: 1 GT bboxes and 1 proposals
008032.jpg: 1 GT bboxes and 1 proposals
008033.jpg: 2 GT bboxes and 4 proposals
008036.jpg: 1 GT bboxes and 1 proposals
008048.jpg: 5 GT bboxes and 29 proposals
008057.jpg: 1 GT bboxes and 9 proposals
008060.jpg: 1 GT bboxes and 2 proposals
008061.jpg: 5 GT bboxes and 26 proposals
008068.jpg: 1 GT bboxes and 1 proposals
008069.jpg: 16 GT bboxes and 25 proposals
008085.jpg: 1 GT bboxes and 6 proposals
008086.jpg: 2 GT bboxes and 2 proposals
008087.jpg: 1 GT bboxes and 1 proposals
008091.jpg: 3 GT bboxes and 4 proposals
008100.jpg: 1 GT bboxes and 1 proposals
008101.jpg: 2 GT bboxes and 2 proposals
008103.jpg: 2 GT bboxes and 3 proposals
008105.jpg: 23 GT bboxes and 19 proposals
008107.jpg: 1 GT bboxes and 2 proposals
008112.jpg: 2 GT bboxes and 3 proposals
008115.jpg: 6 GT bboxes and 12 proposals
008122.jpg: 6 GT bboxes and 28 proposals
008125.jpg: 3 GT bboxes and 6 proposals
008132.jpg: 6 GT bboxes and 8 proposals
008138.jpg: 1 GT bboxes and 1 proposals
008140.jpg: 3 GT bboxes and 12 proposals
008141.jpg: 2 GT bboxes and 1 proposals
008144.jpg: 1 GT bboxes and 1 proposals
008151.jpg: 3 GT bboxes and 8 proposals
008159.jpg: 2 GT bboxes and 10 proposals
008160.jpg: 4 GT bboxes and 11 proposals
008168.jpg: 1 GT bboxes and 1 proposals
008171.jpg: 6 GT bboxes and 12 proposals
008173.jpg: 1 GT bboxes and 5 proposals
008175.jpg: 3 GT bboxes and 4 proposals
008177.jpg: 2 GT bboxes and 7 proposals
008180.jpg: 5 GT bboxes and 7 proposals
008189.jpg: 2 GT bboxes and 3 proposals
008190.jpg: 9 GT bboxes and 25 proposals
008191.jpg: 1 GT bboxes and 7 proposals
008200.jpg: 1 GT bboxes and 2 proposals
008208.jpg: 2 GT bboxes and 1 proposals
008209.jpg: 3 GT bboxes and 9 proposals
008220.jpg: 2 GT bboxes and 5 proposals
008222.jpg: 1 GT bboxes and 1 proposals
008224.jpg: 7 GT bboxes and 20 proposals
008225.jpg: 4 GT bboxes and 8 proposals
008229.jpg: 2 GT bboxes and 1 proposals
008236.jpg: 2 GT bboxes and 5 proposals
008241.jpg: 6 GT bboxes and 10 proposals
008244.jpg: 1 GT bboxes and 1 proposals
008251.jpg: 1 GT bboxes and 12 proposals
008258.jpg: 1 GT bboxes and 1 proposals
008268.jpg: 3 GT bboxes and 3 proposals
008275.jpg: 1 GT bboxes and 2 proposals
008279.jpg: 7 GT bboxes and 4 proposals
008281.jpg: 2 GT bboxes and 4 proposals
008284.jpg: 3 GT bboxes and 7 proposals
008285.jpg: 2 GT bboxes and 4 proposals
008292.jpg: 6 GT bboxes and 5 proposals
008293.jpg: 4 GT bboxes and 14 proposals
008294.jpg: 5 GT bboxes and 6 proposals
008295.jpg: 1 GT bboxes and 1 proposals
008297.jpg: 1 GT bboxes and 3 proposals
008299.jpg: 1 GT bboxes and 2 proposals
008300.jpg: 1 GT bboxes and 1 proposals
008306.jpg: 2 GT bboxes and 2 proposals
008307.jpg: 2 GT bboxes and 3 proposals
008318.jpg: 2 GT bboxes and 2 proposals
008319.jpg: 28 GT bboxes and 42 proposals
008320.jpg: 1 GT bboxes and 1 proposals
008323.jpg: 1 GT bboxes and 3 proposals
008326.jpg: 1 GT bboxes and 2 proposals
008327.jpg: 2 GT bboxes and 2 proposals
008329.jpg: 1 GT bboxes and 5 proposals
008335.jpg: 1 GT bboxes and 4 proposals
008345.jpg: 3 GT bboxes and 7 proposals
008349.jpg: 1 GT bboxes and 3 proposals
008355.jpg: 1 GT bboxes and 1 proposals
008359.jpg: 4 GT bboxes and 19 proposals
008364.jpg: 2 GT bboxes and 1 proposals
008365.jpg: 3 GT bboxes and 8 proposals
008368.jpg: 2 GT bboxes and 2 proposals
008370.jpg: 1 GT bboxes and 1 proposals
008376.jpg: 5 GT bboxes and 9 proposals
008386.jpg: 3 GT bboxes and 9 proposals
008387.jpg: 10 GT bboxes and 14 proposals
008390.jpg: 3 GT bboxes and 3 proposals
008410.jpg: 6 GT bboxes and 18 proposals
008413.jpg: 4 GT bboxes and 5 proposals
008415.jpg: 2 GT bboxes and 4 proposals
008416.jpg: 2 GT bboxes and 4 proposals
008423.jpg: 1 GT bboxes and 1 proposals
008424.jpg: 6 GT bboxes and 14 proposals
008429.jpg: 1 GT bboxes and 6 proposals
008430.jpg: 1 GT bboxes and 2 proposals
008433.jpg: 6 GT bboxes and 12 proposals
008434.jpg: 1 GT bboxes and 4 proposals
008438.jpg: 1 GT bboxes and 2 proposals
008444.jpg: 15 GT bboxes and 23 proposals
008450.jpg: 1 GT bboxes and 2 proposals
008454.jpg: 1 GT bboxes and 0 proposals
008461.jpg: 3 GT bboxes and 5 proposals
008472.jpg: 1 GT bboxes and 2 proposals
008484.jpg: 1 GT bboxes and 4 proposals
008485.jpg: 2 GT bboxes and 3 proposals
008492.jpg: 1 GT bboxes and 1 proposals
008494.jpg: 1 GT bboxes and 7 proposals
008498.jpg: 1 GT bboxes and 16 proposals
008499.jpg: 1 GT bboxes and 2 proposals
008502.jpg: 1 GT bboxes and 2 proposals
008503.jpg: 14 GT bboxes and 9 proposals
008509.jpg: 5 GT bboxes and 21 proposals
008512.jpg: 1 GT bboxes and 5 proposals
008513.jpg: 1 GT bboxes and 3 proposals
008514.jpg: 15 GT bboxes and 1 proposals
008518.jpg: 1 GT bboxes and 1 proposals
008519.jpg: 1 GT bboxes and 4 proposals
008521.jpg: 1 GT bboxes and 2 proposals
008522.jpg: 1 GT bboxes and 7 proposals
008524.jpg: 2 GT bboxes and 8 proposals
008526.jpg: 5 GT bboxes and 22 proposals
008534.jpg: 1 GT bboxes and 1 proposals
008535.jpg: 2 GT bboxes and 2 proposals
008541.jpg: 5 GT bboxes and 16 proposals
008542.jpg: 2 GT bboxes and 6 proposals
008553.jpg: 1 GT bboxes and 3 proposals
008556.jpg: 1 GT bboxes and 12 proposals
008557.jpg: 10 GT bboxes and 10 proposals
008562.jpg: 8 GT bboxes and 6 proposals
008564.jpg: 2 GT bboxes and 9 proposals
008572.jpg: 2 GT bboxes and 9 proposals
008573.jpg: 2 GT bboxes and 4 proposals
008576.jpg: 4 GT bboxes and 5 proposals
008582.jpg: 2 GT bboxes and 5 proposals
008584.jpg: 1 GT bboxes and 1 proposals
008586.jpg: 1 GT bboxes and 1 proposals
008592.jpg: 8 GT bboxes and 15 proposals
008601.jpg: 4 GT bboxes and 9 proposals
008604.jpg: 8 GT bboxes and 9 proposals
008606.jpg: 1 GT bboxes and 4 proposals
008607.jpg: 2 GT bboxes and 5 proposals
008608.jpg: 1 GT bboxes and 0 proposals
008612.jpg: 2 GT bboxes and 6 proposals
008620.jpg: 1 GT bboxes and 1 proposals
008621.jpg: 1 GT bboxes and 1 proposals
008624.jpg: 6 GT bboxes and 23 proposals
008635.jpg: 1 GT bboxes and 3 proposals
008636.jpg: 3 GT bboxes and 2 proposals
008638.jpg: 3 GT bboxes and 1 proposals
008639.jpg: 3 GT bboxes and 13 proposals
008644.jpg: 5 GT bboxes and 0 proposals
008647.jpg: 1 GT bboxes and 1 proposals
008653.jpg: 1 GT bboxes and 1 proposals
008654.jpg: 1 GT bboxes and 4 proposals
008667.jpg: 1 GT bboxes and 1 proposals
008680.jpg: 5 GT bboxes and 20 proposals
008683.jpg: 1 GT bboxes and 1 proposals
008687.jpg: 1 GT bboxes and 1 proposals
008692.jpg: 5 GT bboxes and 5 proposals
008695.jpg: 2 GT bboxes and 4 proposals
008698.jpg: 1 GT bboxes and 2 proposals
008701.jpg: 3 GT bboxes and 3 proposals
008709.jpg: 1 GT bboxes and 5 proposals
008713.jpg: 1 GT bboxes and 5 proposals
008716.jpg: 1 GT bboxes and 6 proposals
008717.jpg: 7 GT bboxes and 20 proposals
008718.jpg: 4 GT bboxes and 7 proposals
008722.jpg: 1 GT bboxes and 1 proposals
008728.jpg: 3 GT bboxes and 6 proposals
008730.jpg: 5 GT bboxes and 16 proposals
008733.jpg: 6 GT bboxes and 17 proposals
008739.jpg: 8 GT bboxes and 7 proposals
008742.jpg: 5 GT bboxes and 10 proposals
008747.jpg: 2 GT bboxes and 13 proposals
008749.jpg: 1 GT bboxes and 12 proposals
008752.jpg: 6 GT bboxes and 7 proposals
008753.jpg: 1 GT bboxes and 0 proposals
008759.jpg: 1 GT bboxes and 1 proposals
008766.jpg: 2 GT bboxes and 1 proposals
008769.jpg: 2 GT bboxes and 5 proposals
008772.jpg: 1 GT bboxes and 2 proposals
008773.jpg: 1 GT bboxes and 2 proposals
008775.jpg: 12 GT bboxes and 16 proposals
008793.jpg: 3 GT bboxes and 9 proposals
008796.jpg: 1 GT bboxes and 4 proposals
008799.jpg: 2 GT bboxes and 8 proposals
008801.jpg: 5 GT bboxes and 11 proposals
008805.jpg: 2 GT bboxes and 2 proposals
008810.jpg: 3 GT bboxes and 2 proposals
008817.jpg: 2 GT bboxes and 18 proposals
008822.jpg: 1 GT bboxes and 1 proposals
008823.jpg: 1 GT bboxes and 6 proposals
008826.jpg: 1 GT bboxes and 0 proposals
008831.jpg: 2 GT bboxes and 9 proposals
008833.jpg: 2 GT bboxes and 13 proposals
008835.jpg: 7 GT bboxes and 5 proposals
008836.jpg: 15 GT bboxes and 17 proposals
008837.jpg: 2 GT bboxes and 1 proposals
008843.jpg: 1 GT bboxes and 1 proposals
008848.jpg: 4 GT bboxes and 13 proposals
008849.jpg: 2 GT bboxes and 1 proposals
008854.jpg: 1 GT bboxes and 1 proposals
008858.jpg: 1 GT bboxes and 3 proposals
008859.jpg: 2 GT bboxes and 9 proposals
008867.jpg: 2 GT bboxes and 2 proposals
008871.jpg: 1 GT bboxes and 2 proposals
008873.jpg: 1 GT bboxes and 4 proposals
008874.jpg: 3 GT bboxes and 6 proposals
008876.jpg: 2 GT bboxes and 3 proposals
008880.jpg: 1 GT bboxes and 1 proposals
008884.jpg: 3 GT bboxes and 4 proposals
008888.jpg: 3 GT bboxes and 4 proposals
008890.jpg: 1 GT bboxes and 4 proposals
008892.jpg: 8 GT bboxes and 18 proposals
008911.jpg: 12 GT bboxes and 2 proposals
008913.jpg: 2 GT bboxes and 13 proposals
008914.jpg: 1 GT bboxes and 1 proposals
008917.jpg: 1 GT bboxes and 1 proposals
008919.jpg: 1 GT bboxes and 1 proposals
008921.jpg: 1 GT bboxes and 3 proposals
008927.jpg: 1 GT bboxes and 3 proposals
008931.jpg: 8 GT bboxes and 21 proposals
008940.jpg: 1 GT bboxes and 1 proposals
008942.jpg: 9 GT bboxes and 18 proposals
008943.jpg: 15 GT bboxes and 12 proposals
008951.jpg: 1 GT bboxes and 2 proposals
008953.jpg: 2 GT bboxes and 3 proposals
008955.jpg: 1 GT bboxes and 6 proposals
008965.jpg: 1 GT bboxes and 1 proposals
008976.jpg: 2 GT bboxes and 1 proposals
008982.jpg: 2 GT bboxes and 3 proposals
008983.jpg: 8 GT bboxes and 24 proposals
008997.jpg: 11 GT bboxes and 23 proposals
009002.jpg: 1 GT bboxes and 1 proposals
009006.jpg: 4 GT bboxes and 3 proposals
009007.jpg: 1 GT bboxes and 9 proposals
009015.jpg: 6 GT bboxes and 10 proposals
009019.jpg: 2 GT bboxes and 1 proposals
009022.jpg: 2 GT bboxes and 3 proposals
009024.jpg: 2 GT bboxes and 2 proposals
009034.jpg: 15 GT bboxes and 26 proposals
009035.jpg: 1 GT bboxes and 1 proposals
009037.jpg: 1 GT bboxes and 7 proposals
009039.jpg: 2 GT bboxes and 1 proposals
009048.jpg: 2 GT bboxes and 7 proposals
009051.jpg: 6 GT bboxes and 16 proposals
009053.jpg: 1 GT bboxes and 1 proposals
009060.jpg: 2 GT bboxes and 3 proposals
009064.jpg: 9 GT bboxes and 17 proposals
009072.jpg: 1 GT bboxes and 9 proposals
009079.jpg: 4 GT bboxes and 3 proposals
009085.jpg: 6 GT bboxes and 13 proposals
009087.jpg: 8 GT bboxes and 21 proposals
009089.jpg: 1 GT bboxes and 2 proposals
009091.jpg: 11 GT bboxes and 17 proposals
009094.jpg: 1 GT bboxes and 4 proposals
009105.jpg: 1 GT bboxes and 3 proposals
009112.jpg: 1 GT bboxes and 1 proposals
009113.jpg: 7 GT bboxes and 1 proposals
009116.jpg: 1 GT bboxes and 1 proposals
009126.jpg: 1 GT bboxes and 12 proposals
009128.jpg: 1 GT bboxes and 2 proposals
009129.jpg: 1 GT bboxes and 5 proposals
009131.jpg: 1 GT bboxes and 10 proposals
009133.jpg: 1 GT bboxes and 1 proposals
009138.jpg: 1 GT bboxes and 1 proposals
009141.jpg: 6 GT bboxes and 12 proposals
009147.jpg: 1 GT bboxes and 1 proposals
009150.jpg: 1 GT bboxes and 4 proposals
009151.jpg: 4 GT bboxes and 14 proposals
009155.jpg: 1 GT bboxes and 4 proposals
009157.jpg: 4 GT bboxes and 3 proposals
009159.jpg: 1 GT bboxes and 1 proposals
009162.jpg: 1 GT bboxes and 2 proposals
009163.jpg: 4 GT bboxes and 19 proposals
009168.jpg: 1 GT bboxes and 2 proposals
009174.jpg: 9 GT bboxes and 3 proposals
009177.jpg: 4 GT bboxes and 16 proposals
009178.jpg: 1 GT bboxes and 1 proposals
009179.jpg: 4 GT bboxes and 12 proposals
009180.jpg: 5 GT bboxes and 15 proposals
009186.jpg: 2 GT bboxes and 5 proposals
009187.jpg: 1 GT bboxes and 1 proposals
009189.jpg: 6 GT bboxes and 16 proposals
009192.jpg: 1 GT bboxes and 0 proposals
009193.jpg: 4 GT bboxes and 3 proposals
009194.jpg: 1 GT bboxes and 11 proposals
009195.jpg: 1 GT bboxes and 1 proposals
009202.jpg: 2 GT bboxes and 4 proposals
009212.jpg: 1 GT bboxes and 1 proposals
009213.jpg: 1 GT bboxes and 2 proposals
009221.jpg: 1 GT bboxes and 1 proposals
009224.jpg: 5 GT bboxes and 5 proposals
009236.jpg: 2 GT bboxes and 5 proposals
009239.jpg: 3 GT bboxes and 11 proposals
009244.jpg: 1 GT bboxes and 1 proposals
009246.jpg: 1 GT bboxes and 7 proposals
009247.jpg: 5 GT bboxes and 39 proposals
009249.jpg: 3 GT bboxes and 6 proposals
009250.jpg: 1 GT bboxes and 2 proposals
009254.jpg: 4 GT bboxes and 4 proposals
009268.jpg: 1 GT bboxes and 2 proposals
009273.jpg: 6 GT bboxes and 2 proposals
009278.jpg: 1 GT bboxes and 4 proposals
009279.jpg: 4 GT bboxes and 17 proposals
009281.jpg: 1 GT bboxes and 2 proposals
009282.jpg: 1 GT bboxes and 1 proposals
009286.jpg: 8 GT bboxes and 16 proposals
009291.jpg: 5 GT bboxes and 14 proposals
009303.jpg: 7 GT bboxes and 26 proposals
009309.jpg: 1 GT bboxes and 1 proposals
009312.jpg: 2 GT bboxes and 16 proposals
009315.jpg: 2 GT bboxes and 13 proposals
009323.jpg: 3 GT bboxes and 6 proposals
009326.jpg: 1 GT bboxes and 8 proposals
009330.jpg: 2 GT bboxes and 2 proposals
009331.jpg: 5 GT bboxes and 7 proposals
009334.jpg: 1 GT bboxes and 3 proposals
009337.jpg: 1 GT bboxes and 1 proposals
009347.jpg: 2 GT bboxes and 3 proposals
009348.jpg: 1 GT bboxes and 6 proposals
009349.jpg: 6 GT bboxes and 22 proposals
009350.jpg: 1 GT bboxes and 13 proposals
009351.jpg: 1 GT bboxes and 1 proposals
009354.jpg: 1 GT bboxes and 2 proposals
009368.jpg: 16 GT bboxes and 21 proposals
009371.jpg: 1 GT bboxes and 2 proposals
009373.jpg: 2 GT bboxes and 8 proposals
009374.jpg: 2 GT bboxes and 1 proposals
009375.jpg: 3 GT bboxes and 6 proposals
009378.jpg: 1 GT bboxes and 1 proposals
009382.jpg: 3 GT bboxes and 6 proposals
009401.jpg: 1 GT bboxes and 1 proposals
009405.jpg: 1 GT bboxes and 1 proposals
009408.jpg: 1 GT bboxes and 3 proposals
009412.jpg: 3 GT bboxes and 2 proposals
009414.jpg: 4 GT bboxes and 2 proposals
009433.jpg: 7 GT bboxes and 4 proposals
009437.jpg: 4 GT bboxes and 26 proposals
009438.jpg: 1 GT bboxes and 1 proposals
009439.jpg: 1 GT bboxes and 4 proposals
009440.jpg: 2 GT bboxes and 8 proposals
009443.jpg: 3 GT bboxes and 2 proposals
009445.jpg: 1 GT bboxes and 7 proposals
009448.jpg: 7 GT bboxes and 7 proposals
009454.jpg: 2 GT bboxes and 24 proposals
009455.jpg: 1 GT bboxes and 1 proposals
009456.jpg: 6 GT bboxes and 15 proposals
009457.jpg: 1 GT bboxes and 2 proposals
009459.jpg: 1 GT bboxes and 1 proposals
009461.jpg: 2 GT bboxes and 4 proposals
009464.jpg: 1 GT bboxes and 1 proposals
009468.jpg: 2 GT bboxes and 7 proposals
009470.jpg: 3 GT bboxes and 2 proposals
009472.jpg: 1 GT bboxes and 4 proposals
009477.jpg: 4 GT bboxes and 14 proposals
009479.jpg: 3 GT bboxes and 3 proposals
009480.jpg: 3 GT bboxes and 2 proposals
009481.jpg: 12 GT bboxes and 20 proposals
009484.jpg: 3 GT bboxes and 1 proposals
009494.jpg: 2 GT bboxes and 5 proposals
009500.jpg: 4 GT bboxes and 12 proposals
009502.jpg: 1 GT bboxes and 2 proposals
009507.jpg: 4 GT bboxes and 6 proposals
009517.jpg: 3 GT bboxes and 13 proposals
009519.jpg: 4 GT bboxes and 10 proposals
009527.jpg: 3 GT bboxes and 0 proposals
009531.jpg: 1 GT bboxes and 0 proposals
009532.jpg: 6 GT bboxes and 12 proposals
009533.jpg: 2 GT bboxes and 10 proposals
009540.jpg: 2 GT bboxes and 7 proposals
009543.jpg: 6 GT bboxes and 12 proposals
009546.jpg: 3 GT bboxes and 4 proposals
009550.jpg: 10 GT bboxes and 18 proposals
009558.jpg: 10 GT bboxes and 1 proposals
009560.jpg: 1 GT bboxes and 1 proposals
009565.jpg: 2 GT bboxes and 9 proposals
009567.jpg: 2 GT bboxes and 3 proposals
009568.jpg: 2 GT bboxes and 6 proposals
009571.jpg: 1 GT bboxes and 2 proposals
009580.jpg: 1 GT bboxes and 1 proposals
009586.jpg: 1 GT bboxes and 7 proposals
009588.jpg: 1 GT bboxes and 1 proposals
009591.jpg: 4 GT bboxes and 8 proposals
009597.jpg: 1 GT bboxes and 1 proposals
009598.jpg: 2 GT bboxes and 6 proposals
009603.jpg: 2 GT bboxes and 2 proposals
009611.jpg: 2 GT bboxes and 0 proposals
009617.jpg: 24 GT bboxes and 30 proposals
009619.jpg: 1 GT bboxes and 2 proposals
009620.jpg: 2 GT bboxes and 3 proposals
009627.jpg: 1 GT bboxes and 3 proposals
009636.jpg: 1 GT bboxes and 12 proposals
009641.jpg: 5 GT bboxes and 8 proposals
009647.jpg: 9 GT bboxes and 16 proposals
009649.jpg: 9 GT bboxes and 19 proposals
009655.jpg: 2 GT bboxes and 1 proposals
009658.jpg: 1 GT bboxes and 2 proposals
009667.jpg: 1 GT bboxes and 2 proposals
009670.jpg: 2 GT bboxes and 3 proposals
009676.jpg: 3 GT bboxes and 6 proposals
009678.jpg: 1 GT bboxes and 6 proposals
009681.jpg: 1 GT bboxes and 1 proposals
009685.jpg: 1 GT bboxes and 9 proposals
009686.jpg: 8 GT bboxes and 12 proposals
009687.jpg: 4 GT bboxes and 13 proposals
009692.jpg: 2 GT bboxes and 6 proposals
009695.jpg: 1 GT bboxes and 2 proposals
009698.jpg: 4 GT bboxes and 3 proposals
009699.jpg: 4 GT bboxes and 17 proposals
009700.jpg: 1 GT bboxes and 1 proposals
009706.jpg: 1 GT bboxes and 3 proposals
009710.jpg: 1 GT bboxes and 2 proposals
009711.jpg: 6 GT bboxes and 19 proposals
009712.jpg: 2 GT bboxes and 2 proposals
009719.jpg: 2 GT bboxes and 1 proposals
009724.jpg: 1 GT bboxes and 1 proposals
009726.jpg: 8 GT bboxes and 22 proposals
009732.jpg: 2 GT bboxes and 4 proposals
009737.jpg: 2 GT bboxes and 5 proposals
009738.jpg: 1 GT bboxes and 4 proposals
009743.jpg: 1 GT bboxes and 2 proposals
009745.jpg: 2 GT bboxes and 7 proposals
009746.jpg: 3 GT bboxes and 3 proposals
009747.jpg: 3 GT bboxes and 5 proposals
009748.jpg: 1 GT bboxes and 1 proposals
009754.jpg: 1 GT bboxes and 3 proposals
009758.jpg: 20 GT bboxes and 43 proposals
009761.jpg: 1 GT bboxes and 4 proposals
009764.jpg: 2 GT bboxes and 9 proposals
009767.jpg: 2 GT bboxes and 3 proposals
009772.jpg: 1 GT bboxes and 2 proposals
009773.jpg: 4 GT bboxes and 11 proposals
009778.jpg: 1 GT bboxes and 4 proposals
009780.jpg: 3 GT bboxes and 2 proposals
009781.jpg: 2 GT bboxes and 2 proposals
009785.jpg: 1 GT bboxes and 1 proposals
009794.jpg: 1 GT bboxes and 1 proposals
009796.jpg: 4 GT bboxes and 17 proposals
009801.jpg: 4 GT bboxes and 8 proposals
009809.jpg: 1 GT bboxes and 1 proposals
009816.jpg: 9 GT bboxes and 12 proposals
009819.jpg: 3 GT bboxes and 1 proposals
009822.jpg: 34 GT bboxes and 32 proposals
009823.jpg: 1 GT bboxes and 3 proposals
009831.jpg: 2 GT bboxes and 7 proposals
009833.jpg: 9 GT bboxes and 33 proposals
009836.jpg: 1 GT bboxes and 2 proposals
009841.jpg: 2 GT bboxes and 6 proposals
009858.jpg: 1 GT bboxes and 3 proposals
009862.jpg: 1 GT bboxes and 1 proposals
009863.jpg: 2 GT bboxes and 2 proposals
009865.jpg: 4 GT bboxes and 15 proposals
009870.jpg: 2 GT bboxes and 3 proposals
009880.jpg: 5 GT bboxes and 6 proposals
009881.jpg: 3 GT bboxes and 2 proposals
009886.jpg: 1 GT bboxes and 1 proposals
009894.jpg: 1 GT bboxes and 5 proposals
009897.jpg: 2 GT bboxes and 2 proposals
009898.jpg: 1 GT bboxes and 1 proposals
009900.jpg: 5 GT bboxes and 8 proposals
009902.jpg: 6 GT bboxes and 13 proposals
009905.jpg: 2 GT bboxes and 2 proposals
009908.jpg: 5 GT bboxes and 5 proposals
009913.jpg: 1 GT bboxes and 4 proposals
009917.jpg: 6 GT bboxes and 10 proposals
009923.jpg: 1 GT bboxes and 5 proposals
009932.jpg: 1 GT bboxes and 3 proposals
009935.jpg: 11 GT bboxes and 21 proposals
009939.jpg: 2 GT bboxes and 6 proposals
009946.jpg: 4 GT bboxes and 4 proposals
009947.jpg: 2 GT bboxes and 4 proposals
009950.jpg: 2 GT bboxes and 2 proposals
009954.jpg: 2 GT bboxes and 7 proposals
009955.jpg: 2 GT bboxes and 6 proposals
009958.jpg: 5 GT bboxes and 30 proposals
Total inference time: 36.4s
15.86% = aeroplane AP 
/content/mAP/main.py:704: MatplotlibDeprecationWarning: 
The set_window_title function was deprecated in Matplotlib 3.4 and will be removed two minor releases later. Use `.FigureManagerBase.set_window_title` or GUI-specific methods instead.
  fig.canvas.set_window_title('AP ' + class_name)
5.49% = bicycle AP 
10.19% = bird AP 
0.80% = boat AP 
0.42% = bottle AP 
8.10% = bus AP 
9.32% = car AP 
48.89% = cat AP 
0.95% = chair AP 
8.52% = cow AP 
6.79% = diningtable AP 
19.11% = dog AP 
27.72% = horse AP 
14.26% = motorbike AP 
13.19% = person AP 
0.52% = pottedplant AP 
0.98% = sheep AP 
8.70% = sofa AP 
32.28% = train AP 
9.03% = tvmonitor AP 
mAP = 12.06%
/content/mAP/main.py:298: MatplotlibDeprecationWarning: 
The set_window_title function was deprecated in Matplotlib 3.4 and will be removed two minor releases later. Use `.FigureManagerBase.set_window_title` or GUI-specific methods instead.
  fig.canvas.set_window_title(window_title)
Figure(640x480)
InĀ [1]:
import os

os.system('jupyter nbconvert --to html w23_ece495_assignment4.ipynb')
This application is used to convert notebook files (*.ipynb)
        to various other formats.

        WARNING: THE COMMANDLINE INTERFACE MAY CHANGE IN FUTURE RELEASES.

Options
=======
The options below are convenience aliases to configurable class-options,
as listed in the "Equivalent to" description-line of the aliases.
To see all configurable class-options for some <cmd>, use:
    <cmd> --help-all

--debug
    set log level to logging.DEBUG (maximize logging output)
    Equivalent to: [--Application.log_level=10]
--show-config
    Show the application's configuration (human-readable format)
    Equivalent to: [--Application.show_config=True]
--show-config-json
    Show the application's configuration (json format)
    Equivalent to: [--Application.show_config_json=True]
--generate-config
    generate default config file
    Equivalent to: [--JupyterApp.generate_config=True]
-y
    Answer yes to any questions instead of prompting.
    Equivalent to: [--JupyterApp.answer_yes=True]
--execute
    Execute the notebook prior to export.
    Equivalent to: [--ExecutePreprocessor.enabled=True]
--allow-errors
    Continue notebook execution even if one of the cells throws an error and include the error message in the cell output (the default behaviour is to abort conversion). This flag is only relevant if '--execute' was specified, too.
    Equivalent to: [--ExecutePreprocessor.allow_errors=True]
--stdin
    read a single notebook file from stdin. Write the resulting notebook with default basename 'notebook.*'
    Equivalent to: [--NbConvertApp.from_stdin=True]
--stdout
    Write notebook output to stdout instead of files.
    Equivalent to: [--NbConvertApp.writer_class=StdoutWriter]
--inplace
    Run nbconvert in place, overwriting the existing notebook (only
            relevant when converting to notebook format)
    Equivalent to: [--NbConvertApp.use_output_suffix=False --NbConvertApp.export_format=notebook --FilesWriter.build_directory=]
--clear-output
    Clear output of current file and save in place,
            overwriting the existing notebook.
    Equivalent to: [--NbConvertApp.use_output_suffix=False --NbConvertApp.export_format=notebook --FilesWriter.build_directory= --ClearOutputPreprocessor.enabled=True]
--no-prompt
    Exclude input and output prompts from converted document.
    Equivalent to: [--TemplateExporter.exclude_input_prompt=True --TemplateExporter.exclude_output_prompt=True]
--no-input
    Exclude input cells and output prompts from converted document.
            This mode is ideal for generating code-free reports.
    Equivalent to: [--TemplateExporter.exclude_output_prompt=True --TemplateExporter.exclude_input=True --TemplateExporter.exclude_input_prompt=True]
--allow-chromium-download
    Whether to allow downloading chromium if no suitable version is found on the system.
    Equivalent to: [--WebPDFExporter.allow_chromium_download=True]
--disable-chromium-sandbox
    Disable chromium security sandbox when converting to PDF..
    Equivalent to: [--WebPDFExporter.disable_sandbox=True]
--show-input
    Shows code input. This flag is only useful for dejavu users.
    Equivalent to: [--TemplateExporter.exclude_input=False]
--embed-images
    Embed the images as base64 dataurls in the output. This flag is only useful for the HTML/WebPDF/Slides exports.
    Equivalent to: [--HTMLExporter.embed_images=True]
--sanitize-html
    Whether the HTML in Markdown cells and cell outputs should be sanitized..
    Equivalent to: [--HTMLExporter.sanitize_html=True]
--log-level=<Enum>
    Set the log level by value or name.
    Choices: any of [0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']
    Default: 30
    Equivalent to: [--Application.log_level]
--config=<Unicode>
    Full path of a config file.
    Default: ''
    Equivalent to: [--JupyterApp.config_file]
--to=<Unicode>
    The export format to be used, either one of the built-in formats
            ['asciidoc', 'custom', 'html', 'latex', 'markdown', 'notebook', 'pdf', 'python', 'qtpdf', 'qtpng', 'rst', 'script', 'slides', 'webpdf']
            or a dotted object name that represents the import path for an
            ``Exporter`` class
    Default: ''
    Equivalent to: [--NbConvertApp.export_format]
--template=<Unicode>
    Name of the template to use
    Default: ''
    Equivalent to: [--TemplateExporter.template_name]
--template-file=<Unicode>
    Name of the template file to use
    Default: None
    Equivalent to: [--TemplateExporter.template_file]
--theme=<Unicode>
    Template specific theme(e.g. the name of a JupyterLab CSS theme distributed
    as prebuilt extension for the lab template)
    Default: 'light'
    Equivalent to: [--HTMLExporter.theme]
--sanitize_html=<Bool>
    Whether the HTML in Markdown cells and cell outputs should be sanitized.This
    should be set to True by nbviewer or similar tools.
    Default: False
    Equivalent to: [--HTMLExporter.sanitize_html]
--writer=<DottedObjectName>
    Writer class used to write the
                                        results of the conversion
    Default: 'FilesWriter'
    Equivalent to: [--NbConvertApp.writer_class]
--post=<DottedOrNone>
    PostProcessor class used to write the
                                        results of the conversion
    Default: ''
    Equivalent to: [--NbConvertApp.postprocessor_class]
--output=<Unicode>
    Overwrite base name use for output files.
                Supports pattern replacements '{notebook_name}'.
    Default: '{notebook_name}'
    Equivalent to: [--NbConvertApp.output_base]
--output-dir=<Unicode>
    Directory to write output(s) to. Defaults
                                  to output to the directory of each notebook. To recover
                                  previous default behaviour (outputting to the current
                                  working directory) use . as the flag value.
    Default: ''
    Equivalent to: [--FilesWriter.build_directory]
--reveal-prefix=<Unicode>
    The URL prefix for reveal.js (version 3.x).
            This defaults to the reveal CDN, but can be any url pointing to a copy
            of reveal.js.
            For speaker notes to work, this must be a relative path to a local
            copy of reveal.js: e.g., "reveal.js".
            If a relative path is given, it must be a subdirectory of the
            current directory (from which the server is run).
            See the usage documentation
            (https://nbconvert.readthedocs.io/en/latest/usage.html#reveal-js-html-slideshow)
            for more details.
    Default: ''
    Equivalent to: [--SlidesExporter.reveal_url_prefix]
--nbformat=<Enum>
    The nbformat version to write.
            Use this to downgrade notebooks.
    Choices: any of [1, 2, 3, 4]
    Default: 4
    Equivalent to: [--NotebookExporter.nbformat_version]

Examples
--------

    The simplest way to use nbconvert is

            > jupyter nbconvert mynotebook.ipynb --to html

            Options include ['asciidoc', 'custom', 'html', 'latex', 'markdown', 'notebook', 'pdf', 'python', 'qtpdf', 'qtpng', 'rst', 'script', 'slides', 'webpdf'].

            > jupyter nbconvert --to latex mynotebook.ipynb

            Both HTML and LaTeX support multiple output templates. LaTeX includes
            'base', 'article' and 'report'.  HTML includes 'basic', 'lab' and
            'classic'. You can specify the flavor of the format used.

            > jupyter nbconvert --to html --template lab mynotebook.ipynb

            You can also pipe the output to stdout, rather than a file

            > jupyter nbconvert mynotebook.ipynb --stdout

            PDF is generated via latex

            > jupyter nbconvert mynotebook.ipynb --to pdf

            You can get (and serve) a Reveal.js-powered slideshow

            > jupyter nbconvert myslides.ipynb --to slides --post serve

            Multiple notebooks can be given at the command line in a couple of
            different ways:

            > jupyter nbconvert notebook*.ipynb
            > jupyter nbconvert notebook1.ipynb notebook2.ipynb

            or you can specify the notebooks list in a config file, containing::

                c.NbConvertApp.notebooks = ["my_notebook.ipynb"]

            > jupyter nbconvert --config mycfg.py

To see all available configurables, use `--help-all`.

[NbConvertApp] WARNING | pattern 'w23_ece495_assignment4.ipynb' matched no files
Out[1]:
65280